I have a directory containing a large number of directories. Each directory contains some files and in some cases another directory.
parent_directory sub_dir_1 sub_dir_1.txt sub_dir_1_1.txt sub_dir_2 sub_dir_2.txt sub_dir_2_1.txt sub_dir_3 sub_dir_3.txt sub_dir_3_1.txt sub_dir_4 sub_dir_4.txt sub_dir_4_1.txt sub_dir_5 sub_dir_5.txt sub_dir_5_1.txt
I need to check that each sub_dir contains at least one file with the exact same name. I don’ need to check any further down if there are sub directories within the sub_dirs.
I was thinking of using for d in ./*/ ; do (command here); done
but I dont know how to get access to the sub_dir name inside the for loop
for d in ./*/ ; do (if directory does not contain 1 file that is the same name as the directory then echo directory name ); done
What is the best way to do this or is there a simpler way?
Advertisement
Answer
from the parent directory
find -maxdepth 1 -type d -printf "%fn" | xargs -I {} find {} -maxdepth 1 -type f -name {}.txt
will give you the name/name.txt pair. Compare with the all dir names to find the missing ones.
UPDATE
this might be simpler, instead of scanning you can check whether file exists or not
for f in $(find -maxdepth 1 -type d -printf "%fn"); do if [ ! -e "$f/$f.txt" ]; then echo "$f not found"; fi; done