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 (
findnon produce tali nomi di file, ma non è dannoso e potrebbe essere richiesto per costrutti simili) -namecontrolla prima del-typecontrolla perché quest'ultimo a volte richiede unstat- No
dirnamerichiesto perché%hspecificatore stampa già il nome della directory -quitper interrompere la ricerca dopo il primo file trovato, quindi nessunheadrichiesto 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 afindper limitare ulteriormente i file che ottieni. - Il piping attraverso
head -1filtrerà tutto tranne il primo. $()è un modo per prendere l'output di un comando e metterlo nella riga di comando per un altro comando.dirnamepuò prendere una specifica completa del file e darti il bit del percorso.cdcambia 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]> _