Skip to content
Advertisement

linux command line recursively check directories for at least 1 file with the same name as the directory

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
User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement