Quanto segue dovrebbe essere più sicuro:
cd -- "$(find / -name ls -type f -printf '%h' -quit)"
Vantaggi:
- Il doppio trattino impedisce l'interpretazione di un nome di directory che inizia con un trattino come opzione (
find
non produce tali nomi di file, ma non è dannoso e potrebbe essere richiesto per costrutti simili) -name
controlla prima del-type
controlla perché quest'ultimo a volte richiede unstat
- No
dirname
richiesto perché%h
specificatore stampa già il nome della directory -quit
per interrompere la ricerca dopo il primo file trovato, quindi nessunhead
richiesto che causerebbe il fallimento dello script sui nomi di directory contenenti newline
Puoi usare qualcosa come:
pax[/home/pax]> cd "$(dirname "$(find / -type f -name ls | head -1)")"
pax[/usr/bin]> _
Questo individuerà il primo ls
file normale quindi passa a quella directory.
In termini di cosa fa ogni bit:
- La ricerca inizierà da
/
e cerca verso il basso, elencando tutti i file regolari (-type f
) chiamatols
(-name ls
). Ci sono altre cose che puoi aggiungere afind
per limitare ulteriormente i file che ottieni. - Il piping attraverso
head -1
filtrerà tutto tranne il primo. $()
è un modo per prendere l'output di un comando e metterlo nella riga di comando per un altro comando.dirname
può prendere una specifica completa del file e darti il bit del percorso.cd
cambia solo in quella directory.
Se esegui ogni bit in sequenza, puoi vedere cosa succede:
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]> _