我正在寻找一种可以通过生成脚本来同步文件夹的工具,然后可以从命令行运行该脚本,并且生成的脚本不需要安装该工具即可运行。
比如它可以比较目录,然后编写复制/删除操作脚本,并允许您保存脚本并从任何计算机运行脚本。
另外,我正在使用 Windows World。我查看了不少同步工具,但到目前为止,我还没有看到任何一款可以生成脚本的工具。
任何建议都将非常感谢!
编辑:我的情况是,我们有几个网站具有相同的核心代码库。当此核心代码库更新时,会产生新文件、更改文件和删除文件。
我想创建一个脚本,该脚本可以与新文件和已更改文件一起打包,然后复制这些文件并删除不再需要的文件。这有点像一个非常简单的更新程序。目前我使用 winmerge 执行此操作,将已更改文件和新文件放在存档中,然后复制缺失项目的名称并手动编写脚本。
由于包中只包含新文件和已更改文件,因此脚本必须记住需要删除哪些文件,因为当我们运行脚本时,它不必连接回原始源来找出已删除的文件。目前我手工编写脚本,这很繁琐。我只是希望某个文件同步工具能够打包包含已更改文件和删除文件的更新,这似乎是一个不错的功能。
答案1
我的理解是,您有一个源,但有多个相同的目标。您正在对源进行更改(创建、更新、删除),并想轻松地使目标与源完全相同,并进行所有这些更改?
那么这就是你所需要的:
robocopy "\\sourcepath\folder" "\\destinationpath1\folder" /MIR /NFL /NDL
robocopy "\\sourcepath\folder" "\\destinationpath2\folder" /MIR /NFL /NDL
robocopy "\\sourcepath\folder" "\\destinationpath3\folder" /MIR /NFL /NDL
/MIR 开关将使您的目标与源相同,包括您的删除操作。/NFL 和 /NDL 阻止 robocopy 输出正在更改的文件和文件夹。这将产生一个简单的输出,其中列出了更改的文件的数量和大小。如果您想要同步内容的日志,请排除这些开关。
但是,如果您在目的地设置了任何自定义设置,这些设置将被删除。
克里斯对这个答案的第一条评论进行了更新
我认为您所寻找的东西不可能通过 robocopy 或其他命令行工具本身实现。
不过,我认为这里有一些伪代码可以满足您的要求。实际脚本超出了我的能力范围,没有进行大量研究,但这是您需要的工作流程:
$codebase = "\\codebase\"
$comparesource = "\\destination to compare to codebase\"
$packagesource = "\\where you store update package files\"
$finaldestination = "\\path you're actually trying to update\"
robocopy $codebase $comparesource /MIR /LOG:c:\log.txt /FP /NS /NJH /NJS /L
- /FP = 日志文件中列出的完整路径
- /NS = 日志文件中未列出大小
- /NJH 和 /NJS = 日志文件中没有作业标题和摘要
- /L = 仅列出将会发生什么,实际上不做任何更改
这将为你提供一个包含如下输出的文件:
*EXTRA File C:\file1.txt
New File c:\file2.xls
Newer c:\file3.txt
然后需要运行:
If line contains "newer" or "New File" rest of line enters array $copyfilename
If line contains "*EXTRA" rest of line enters array $deletefilename
\\This would only work for a flat structure; subfolders complicate things and you'd need to grab the file name and subfolder name instead.
for each in $copyfilename {
robocopy $codebase\$copyfilename $packagesource\$copyfilename /e
Append above line to $packagesource\updatepackage.bat, replacing $codebase with $packagesource and $packagesource with $finaldestination
}
for each in $deletefilename {
append "del $finaldestination\$deletefilename" to $packagesource\updatepackage.bat
}
最后,您将拥有一个包含新文件和更改文件的文件夹(您的 $packagesource),以及一个批处理文件,其中包含针对这些新文件和更改文件的复制命令以及针对已删除文件的删除命令。