I have many files in a directory A
.
Some of those files exist in a directory tree with sub-directories B/B1
, B/B2
, B/B3
, B/B4
, ...
Note that some files have spaces in their names.
For example:
in directory A
:
- there's a file named
A/red file.png
there's another named
A/blue file.png
and, in directory tree
B
:there's a file named
B/small/red file.png
In this example, I would like a script to tell me that the file
blue file.png
does not exist in the directoryB
.
How can I write a script that will list all the files in A
that are not found under the directory tree B
?
# 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
If your find
lacks -printf
, you can try:
comm -23 <( find A -type f -exec basename {} \; | sort | uniq ) <( find B -type f -exec basename {} \; | sort | uniq )
This is version which can cope with all filenames, including ones containing newlines:
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'
来源:https://stackoverflow.com/questions/11440332/in-bash-find-all-files-in-flat-directory-that-dont-exist-in-another-directory-t