我正在尝试比较 Linux 中的 2 个目录( A / B )并删除 B 中 A 中不存在的任何文件。
例如,如果文件“1.jpg”存在于目录 B 中,但不存在于目录 A 中,则需要将其从 B 中删除。
我尝试过使用 diff 但所有文件本质上都不同,所以它似乎不起作用。 (它们是不同大小的缩略图,但具有相同的 id)。因此,这必须仅通过文件名来完成,而忽略文件的实际内容。
有人可以阐明如何以最小的努力做到这一点吗?
答案1
rsync
可以快速轻松地做你想做的事:
rsync --dry-run --verbose --recursive --existing --ignore-existing --delete-after A/ B/
来自帮助:
--existing skip creating new files on receiver
--ignore-existing skip updating files that already exist on receiver
--delete delete extraneous files from destination dirs
dry-run
对建议的结果感到满意后,删除该选项以实际执行删除。
手册页对选项有更明确的描述,甚至提到了您的用例:
--existing, --ignore-non-existing
This tells rsync to skip creating files (including directories)
that do not exist yet on the destination. If this option is
combined with the --ignore-existing option, no files will be
updated (which can be useful if all you want to do is to delete
extraneous files).
--ignore-existing
This tells rsync to skip updating files that already exist on
the destination (this does not ignore existing directores, or
nothing would get done). See also --existing.
答案2
对于一级目录
diff -u <(ls A) <(ls B) | sed -n '4,$s/^+//p' | xargs -I{} ls -l B/{}
ls -l
rm -v
测试后,如果它正在执行您想要的操作,则应更改为。
rsync
更好,当然。但这只是另一种变体。