Question

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?

Was it helpful?

Solution

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

OTHER TIPS

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'
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top