When searching for .txt files that are in 2 different home directories only one shows up depending on the present working directory. Why is this?
/home/bob/1.txt
/home/alice/dir1/2.txt
pwd /tmp
[root@host tmp]#find /home -name *.txt
/home/bob/1.txt
/home/alice/dir1/2.txt
pwd /home
[root@host bob]#find /home -name *.txt
/home/bob/1.txt
Why does searching from within the bob directory only return the one file?
CodePudding user response:
Why does searching from within the bob directory only return the one file?
Because when the working directory is /home/bob
, the *.txt
in the find
command is expanded by the shell (to 1.txt
) and that is what is passed to find
. That is, find /home -name 1.txt
. That will find the file in /home/bob
, but not the differently named one in /home/alice
. It would find /home/alice/1.txt
if such a file existed.
On the other hand, when the pattern does not match any file (relative to the working directory) it is passed on as a literal. At least by default -- you should be careful about this, because the pattern would instead be expanded to nothing if the nullglob
shell option were in effect and the find
command were executed from a location where the pattern didn't match any files.
If you want to ensure that shell pathname expansion is not applied to the pattern then quote it:
find /home -name '*.txt'
or
find /home -name \*.txt
or ....