【问题标题】:Need help reprogramming a short batch program to macOS bash需要帮助将短批处理程序重新编程为 macOS bash
【发布时间】:2017-02-11 00:05:58
【问题描述】:

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

这是脚本:

@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 开关),在解决了“错误解释器”错误后遇到了一些困难,我返回了源驱动器上所有文件的列表。我假设这将在一次备份后恢复为无,并且只有源驱动器上的后续更改?

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

【问题讨论】:

  • 尝试使用rsync,它包含在bash (man rsync)中...
  • 感谢 rsync 的建议。我现在试一试,我会让你知道它是如何工作的。这应该比我在 Windows 上的设置要简单得多。
  • rsync 不包含在 bash 中;它是一个完全独立的程序,您可以从bash(或任何其他shell,就此而言)开始。它可能已经安装,也可能尚未安装。
  • 我确实注意到了这一点,尤其是在阅读它的手册页时。对我来说,它是随 MacOS 安装的,所以我认为它是和其他人一起安装的,但无论如何感谢您指出这一点:)

标签: bash macos batch-file rsync


【解决方案1】:

只需使用 rsync。您可以设置一个 cron 作业来运行一个 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

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

【讨论】:

  • @mklement0 你是对的。我编辑了我的答案,谢谢。
  • 我刚刚保存为 .command,里面有 rsync 命令,这对我来说很好用。感谢大家的帮助
猜你喜欢
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多