在Bash中查找所有位于扁平目录中的文件,这些文件在另一个目录树中不存在。

3

我有许多文件存储在目录A中。

其中一些文件存在于带有子目录B/B1B/B2B/B3B/B4等的目录树中。 请注意,一些文件名中含有空格。

例如:

在目录A中:

  • 有一个名为A/red file.png的文件

  • 还有另一个名为A/blue file.png的文件

    并且在目录树B中:

  • 有一个名为B/small/red file.png的文件

    在这个例子中,我想要一个脚本告诉我,在目录树B下没有找到文件blue file.png

我怎样编写一个脚本,可以列出所有在目录A中但在目录树B下找不到的文件?

2个回答

7
# A
# ├── blue file.png
# └── red file.png
# B
# └── small
#     └── red file.png

$ comm -23 <( find A -type f -printf '%f\n' | sort | uniq ) <( find B -type f -printf '%f\n' | sort | uniq )
blue file.png

如果您的 find 命令没有 -printf 选项,您可以尝试以下命令:

comm -23 <( find A -type f -exec basename {} \; | sort | uniq ) <( find B -type f -exec basename {} \; | sort | uniq )

谢谢。我的“find”似乎没有“-printf”,所以我使用了“-print”。这不应该有任何影响,对吧? - martin jakubik
等一下,有些东西出了问题。我仍然在结果中得到了A和B中都存在的文件。 - martin jakubik
尝试使用以下命令:comm -23 <( find A -type f -exec basename {} \; | sort | uniq ) <( find B -type f -exec basename {} \; | sort | uniq ) - Thedward
你使用的是哪个操作系统/版本? - Thedward
-exec 选项在每个匹配的文件上运行一个命令,{} 将被替换为文件路径,并以分号终止命令。在分号之前加上反斜杠是为了防止 shell 将其解释为 shell 语法。 - Thedward
显示剩余2条评论

0

这是一个版本,可以处理包括换行符在内的所有文件名:

comm -z23 <(find dir1 -type f -printf '%f\0' | sort -uz) <(find dir2 -type f -printf '%f\0' | sort -uz) | xargs -0 printf '%s\n'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接