Lo siguiente debería ser más seguro:
cd -- "$(find / -name ls -type f -printf '%h' -quit)"
Ventajas:
- El guión doble evita la interpretación de un nombre de directorio que comienza con un guión como una opción (
findno produce tales nombres de archivo, pero no es dañino y podría ser necesario para construcciones similares) -nameverificar antes del-typeverifique porque este último a veces requiere unstat- Ningún
dirnamerequerido porque el%hel especificador ya imprime el nombre del directorio -quitpara detener la búsqueda después del primer archivo encontrado, por lo tanto, noheadrequerido, lo que haría que la secuencia de comandos fallara en los nombres de directorio que contienen líneas nuevas
Puedes usar algo como:
pax[/home/pax]> cd "$(dirname "$(find / -type f -name ls | head -1)")"
pax[/usr/bin]> _
Esto ubicará el primer ls archivo regular y luego cambie a ese directorio.
En términos de lo que hace cada bit:
- La búsqueda comenzará en
/y busque hacia abajo, listando todos los archivos regulares (-type f) llamadols(-name ls). Hay otras cosas que puedes agregar afindpara restringir aún más los archivos que obtienes. - La tubería a través de
head -1filtrará todos excepto el primero. $()es una forma de tomar el resultado de un comando y ponerlo en la línea de comando para otro comando.dirnamepuede tomar una especificación de archivo completa y proporcionarle el bit de ruta.cdsolo cambia a ese directorio.
Si ejecuta cada bit en secuencia, puede ver lo que sucede:
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]> _