我正在尝试比较 2 个卷,它们主要具有相同的内容,但文件夹结构完全不同。(大约 200 万个文件。)
我想根据大小和名称查看哪些文件仅位于 1 个文件夹中,而不位于其他文件夹中。
我尝试了这个:
find /Volumes/1/ /Volumes/2/ -not -empty -type f -printf "%D\t%s\t%f\n" | sort -t$'\t' -k2 -n | uniq -uf1 | sort
其想法是获取所有文件的列表,包括设备、大小和名称,然后删除所有重复项。
...但它不起作用。我的结果中仍然包含两个驱动器共有的文件。
理想情况下,我还想在结果列表中包含完整路径,但我不知道如何在不弄乱排序/唯一性的情况下包含它。
答案1
编辑:关于保存设备的需要的回答
find dir1/ dir2/ -type f -printf "%D\t%s\t%f\n" | \
sort -t$'\t' -k2 | \
uniq -uf2
find /Volumes/1/ /Volumes/2/ -type f -printf "%f\n" | sort | uniq -u
将仅显示文件名缺失的文件
find /Volumes/1/ /Volumes/2/ -type f -printf "%s-%f\n" | sort | uniq -u
将通过匹配文件名和大小显示丢失的文件
如果大小不匹配,第二个选项将输出两次文件。如果这不是您想要的,您可以像这样重新过滤列表:
find /Volumes/1/ /Volumes/2/ -type f -printf "%s\t%f\n" | sort | uniq -u | \
cut -d$'\t' -f 2|sort|uniq
答案2
使用带有 -R 的 rsync(相对选项显示完整路径)
rsync -rvcnR --delete path_to_sync/ path_to_orig/
另一个命令行开关 r、v、c 和 n 告诉 rsync(查看手册页了解详细信息)对两个目录执行详细、递归、基于校验和的同步,但仅用于显示:-n
编辑以允许删除和移动文件,这会导致初始 rsync 之后文件结构损坏,发起人在我回答后对此进行了澄清。
将您的发现更改为如下内容:
find /Volume/1/ /Volume/2/ -printf '%f %s\t%D%p\n' | sort -uk1,1 | cut -f 2- -d ' '
使用 printf 使用文件名创建第一个字段,然后是您需要的字段,按第一个字段对唯一文件进行排序,然后删除字段 1,留下唯一文件。如果您在文件名中使用空格,则需要使用与我用于剪切分隔符的空格不同的分隔符。