I find it strange that when I use the * wildcard , ls sometimes takes it literally. Here’s the actual case: I have the following folder structure:
This is the output of ls
01 03 05 07 09 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 98 ALL_RAW Implemented_NN_Model.h5
Each of the numbered folders (00 to 99) contains the following files:
00_Binarized_Cutoff_0.99_.tif 00_dot_img_model.png 00_Final_Loc.tif 00_Raw_Prediction.tif Implemented_NN_Model.h5
I want to extract all the *_Final_Loc.tif files from these folders.
Hence I tried this:
ls -R *Final*tif, and this: ls *Final*tif.
I get the same output in both cases:
ls: cannot access '*Final*tif': No such file or directory
I am just curious to know why ls takes the * literally, and what is the correct way?
A side information, I was able to do this task, but when I used this:
ls [0-9][0-9]/*Final*tif
i.e.,
for file in `ls [0-9][0-9]/*Final*tif` ; do cp ${file} ../ALL_Final_Loc/ ; done
And this is strange too, since I don’t find a logical explanation for why it should work here.
>Solution :
You have to specify the directory as well like so:
ls */*Final*tif
Unfortunately, ls -R doesn’t work with wildcards in a particularly useful way so for a case where there are multiple directory levels you could use find, like so:
find . -name '*Final*tif'