You can use something like:
cd -- "$(dirname "$(find / -type f -name ls | head -1)")"
This will locate the first ls
regular file then change to that directory.
In terms of what each bit does:
- The
find
will start at/
and search down, listing out all regular files (-type f
) calledls
(-name ls
). There are other things you can add tofind
to further restrict the files you get. - The
| head -1
will filter out all but the first line. $()
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, the--
is used to prevent treating a directory name beginning with a hyphen from being treated as an option tocd
.
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]> _