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 directory B
.
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 )