在bash中查找平面目录中另一个目录树中不存在的所有文件

时间:2012-07-11 19:49:54

标签: file bash find not-exists directory-tree

我在目录A中有很多文件。

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

例如:

目录A中的

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

    的人

    ,在目录树B中:

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

    的文件

    在这个例子中,我想要一个脚本告诉我文件blue file.pngB目录中不存在。

如何编写一个脚本,列出A中目录树B下找不到的所有文件?

2 个答案:

答案 0 :(得分:5)

# 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 )

答案 1 :(得分: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'