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
findwill start at/and search down, listing out all regular files (-type f) calledls(-name ls). There are other things you can add tofindto further restrict the files you get. - The
| head -1will 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.dirnamecan take a full file specification and give you the path bit.cdjust 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]> _