In a shell script how would I find a file by a particular name and then navigate to that directory to do further operations on it?
From here I am going to copy the file across to another directory (but I can do that already just adding it in for context.)
To change to a directory specified by a path name, type cd followed by a space and the path name (e.g., cd /usr/local/lib) and then press [Enter]. To confirm that you've switched to the directory you wanted, type pwd and press [Enter]. You'll see the path name of the current directory.
You can use something like:
pax[/home/pax]> cd "$(dirname "$(find / -type f -name ls | head -1)")"
pax[/usr/bin]> _
This will locate the first ls
regular file then change to that directory.
In terms of what each bit does:
/
and search down, listing out all regular files (-type f
) called ls
(-name ls
). There are other things you can add to find
to further restrict the files you get.head -1
will filter out all but the first.$()
is a way to take the output of a command and put it on the command line for another command.dirname
can take a full file specification and give you the path bit.cd
just changes to that directory.If you execute each bit in sequence, you can see what happens:
pax[/home/pax]> find / -type f -name ls
/usr/bin/ls
pax[/home/pax]> find / -type f -name ls | head -1
/usr/bin/ls
pax[/home/pax]> dirname "$(find / -type f -name ls | head -1)"
/usr/bin
pax[/home/pax]> cd "$(dirname "$(find / -type f -name ls | head -1)")"
pax[/usr/bin]> _
The following should be more safe:
cd -- "$(find / -name ls -type f -printf '%h' -quit)"
Advantages:
find
doesn't produce such file names, but it's not harmful and might be required for similar constructs)-name
check before -type
check because the latter sometimes requires a stat
dirname
required because the %h
specifier already prints the directory name-quit
to stop the search after the first file found, thus no head
required which would cause the script to fail on directory names containing newlinesIf you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With