我已经编写了一个批处理程序(很久以前),用于将我的数据从一个外部驱动器备份到另一个外部驱动器。它扫描驱动器,生成其中所有文件夹的目录文件,并计算行数(以及文件夹)。从那里它从该文件读取,一次一行,并将目录文件列表中每个文件夹的内容复制到另一个驱动器,只复制上次复制时的新内容或修改过的内容,如果有的话是在备份驱动器上,已从源驱动器中删除,它留在那里。它只是不断添加,而不是删除。这是故意的,不用担心。
这是脚本:
@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错过了某些数据,或者是否因为在目标驱动器上找到匹配而跳过了部分数据?
答案 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
您可以在这里阅读更多内容
我可能会留下一些东西,但我相信有人会纠正我。 祝你好运