我有一个文件夹的两个副本
src/
dest/
Run Code Online (Sandbox Code Playgroud)
我想合并它们,执行以下操作:
如果一个文件只在src,我希望它被移动到dest
如果一个文件只在 . dest,我希望它忽略 IE。
如果文件在两者中并且具有相同的内容(即相同的大小和日期),则从src
如果文件是在这两个并执行不具有相同的内容,留下src这样我就可以手动将它们合并。
只有极少数文件(占总文件的 0% 到 5% 之间)应该属于最后一个类别,但我不知道如何将两者中的文件和相同的文件与两者分开,但不同。
我试图弄清楚如何做到这一点,rsync但到目前为止无济于事。
Tok*_*Tok 17
我只进行了有限的功能测试,所以请小心使用这个命令 (--dry-run):
rsync -avPr --ignore-existing --remove-source-files src/ dest
Run Code Online (Sandbox Code Playgroud)
请注意尾随 / 因为这将递归到 src 而不是复制 src 本身,这应该保持您现有的路径。
通过将 --ignore-existing 标志与 --remove-source-files 标志结合使用,您将仅从 src 中删除从 src 同步到 dest 的文件,即以前仅在 dest 中不存在的文件。
要删除非同步文件,即那些已经存在于 dest/ 中的文件,如 src/,您可以使用:
for file in `find src/ -type f`; do diff $file `echo $file | sed 's/src/dest/'` && rm $file || echo $file; done
Run Code Online (Sandbox Code Playgroud)
或者
find src -type f -exec bash -c 'cmp -s "$0" "${0/#src/dest}" && rm "$0"' {} \;
Run Code Online (Sandbox Code Playgroud)
如果文件名可以包含空格/新行/...关于 Gilles 对特殊字符的评论,这当然是需要注意的,并且有很多解决方案,最简单的方法是将 -i 传递给 rm,它会在所有删除之前进行提示。如果提供 src/ 或其父路径来查找,但是,完全限定的路径应该导致 diff 和 rm 命令正确处理所有文件名,而无需引用。