需要帮助将短批量程序重新编程为macOS bash

时间:2017-02-11 00:05:59

标签: bash macos batch-file rsync

我已经编写了一个批处理程序(很久以前),用于将我的数据从一个外部驱动器备份到另一个外部驱动器。它扫描驱动器,生成其中所有文件夹的目录文件,并计算行数(以及文件夹)。从那里它从该文件读取,一次一行,并将目录文件列表中每个文件夹的内容复制到另一个驱动器,只复制上次复制时的新内容或修改过的内容,如果有的话是在备份驱动器上,已从源驱动器中删除,它留在那里。它只是不断添加,而不是删除。这是故意的,不用担心。

这是脚本:

@echo off

set /p Drive=The Archive Drive Letter: 
cls
set /p Drive2=The Archive II Drive Letter: 

dir %Drive%:\ /B >directory

@setlocal enableextensions enabledelayedexpansion

set lines=0

:the
set location=directory

set /a "lines = lines + 1"

set curr=1
for /F "delims=" %%a in ('type %location%') do (
    for %%b in (!lines!) do (
        if !curr!==%%b set foldername=%%a
    )
    set /a "curr = curr + 1"
)

xcopy "%drive%:\%foldername%" "%Drive2%:\THE ARCHIVE Backup\%foldername%\" /S /M /Y

timeout -t 2

goto :the

endlocal

我需要帮助制作一个在MacOS bash下运行的相同程序。

我已尝试使用等效命令并研究了如何在bash中完成任务,但我使用MacOS的经验非常有限。

我很欣赏bash下的一些事情,例如驱动器命名。在上面的批处理脚本中,我调用了一个用户变量来确认驱动器号,但这只是一个故障保护,以防驱动器字母发生变化(就像它们一样)。然而,在MacOS驱动器下通过名称调用驱动器,我将不会更改,因此我很乐意删除部分代码。

在我的具体案例中, 源驱动器位于“/ Volumes / The ARCHIVE”

目标驱动器位于“/ Volumes / The ARCHIVE II”

我们非常感谢任何帮助,我很乐意接受任何可能会改善我对某些事情有点混乱的想法。

谢谢!

编辑:

我运行了命令(使用-n开关),在遇到“糟糕的解释器”错误之后遇到了一些困难,我已经解决了这个问题,我在源驱动器上返回了所有文件的列表。我假设一次备份后这将返回none,并且只有源驱动器上的后续更改?

此外,我返回了一行“总大小为528045001932”我假设这是以字节为单位,因此转换为千兆字节时为528GB,或491GB(取决于1024对1000字节/千字节)。唯一的问题是,源驱动器上的总数据量不止于此。这是否意味着rsync错过了某些数据,或者是否因为在目标驱动器上找到匹配而跳过了部分数据?

1 个答案:

答案 0 :(得分:2)

只需使用rsync。您可以设置一个cron作业来运行rsync的一个目录到另一个目录的bash脚本。

只需将以下内容保存为copier.sh

#!/bin/bash
rsync -rv /Volumes/ARCH /Volumes/ARCH2

然后将文件添加到crontab。 如果需要帮助,请查看rsync和crontab的手册页

编辑: 我忘了MacOS更喜欢你现在使用launchd。您应该阅读有关如何使用launchd的信息,但我会给您一个可能有效或无效的示例。

创建一个名为com.directoryCopier.plist的plist文件,并将其放在/ Library / LaunchDaemons目录中。该文件应如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.directoryCopier</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/Path/To/copier.sh</string>
    </array>

    <key>StartInterval</key>
    <integer>86400</integer>

    <key>StandardErrorPath</key>
    <string>/tmp/copier.err</string>

    <key>StandardOutPath</key>
    <string>/tmp/copier.out</string>

    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

通过重新启动或输入命令

启动服务
sudo launchctl load /Library/LaunchDaemons/com.directoryCopier.plist

您可以在这里阅读更多内容

https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html

我可能会留下一些东西,但我相信有人会纠正我。 祝你好运