在 Linux 中查找 2 个目录之间丢失的文件名

在 Linux 中查找 2 个目录之间丢失的文件名

我正在尝试比较 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 -lrm -v测试后,如果它正在执行您想要的操作,则应更改为。

rsync更好,当然。但这只是另一种变体。

相关内容