当将照片从不同来源复制到我的主存档时,我只想复制存档中尚未存在的文件。rsync 或文件比较应用程序(如 WinMerge 和 Meld)似乎无法检查文件是否已经以不同的名称或在不同子文件夹中存在。首先将所有新源照片复制到存档,然后删除重复项,然后整理文件,这似乎是额外的工作。
有没有办法检查源文件夹中的哪些文件在目标文件夹中找不到?子文件夹也应该检查。文件可以有不同的名称或不同的位置。
答案1
使用find
withmd5sum
获取源和目标中所有文件的校验和,然后使用comm
查找目标中缺少的校验和。
或者您可以尝试一下-y
选项rsync
。
答案2
如何做到这一点取决于您的图像文件是否按位相同,或者仅在视觉上相似(例如,因为它们可能有不同的注释或被重新压缩,裁剪......)。
如果文件相同,并且您可以在源文件和存档中重命名它们,则很容易将它们重命名为始终具有相同的名称。您可以将旧名称保留为符号链接。未经测试:
for orig in *.jpg; do
canon=$(<"$orig" md5sum | sed 's/ .*//').jpg
mv -i "$orig" "$canon"
ln -s "$canon" "$orig"
done
这假设您的存档是一个目录。如果有子目录,您需要更改*.jpg
为**/*.jpg
(需要 bash 4 或 zsh),并安排将适当数量的添加../
到ln
命令中。
此后,rsync 将仅复制新照片的内容和名称以及现有照片的新名称。
如果您只能重命名档案中的文件,那么您仍然可以通过巧妙地使用符号链接来安排一些事情,也许rsync --copy-unsafe-links
……
如果文件只是在视觉上相似,那就更复杂了,而且不可能有完全自动化的答案(在裁剪版本和低质量版本之间,必须由人类做出选择)。一些比较视觉上相似的图像的工具可能会有所帮助,例如浏览(交互式)或查找重复图片(命令行)。
请注意,由于您没有指定您的操作系统,我提出了适用于我的操作系统的建议。它们适用于任何类 Unix 系统,包括 OSX 和 Cygwin。符号链接的想法也可以在 Windows XP 及更新版本(甚至更早版本)上原生运行,但需要安装其他工具。
答案3
整体 ”不同的名称或不同的子文件夹中“事情可能有点难以弄清楚......当然你可以做哈希比较,但随着目标目录的增长,进行合并的时间也会增加。
它不是很花哨,但是使用像 Robocopy for Windows 这样的程序怎么样?
robocopy /E source destination