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 (
find
no produce tales nombres de archivo, pero no es dañino y podría ser necesario para construcciones similares) -name
verificar antes del-type
verifique porque este último a veces requiere unstat
- Ningún
dirname
requerido porque el%h
el especificador ya imprime el nombre del directorio -quit
para detener la búsqueda después del primer archivo encontrado, por lo tanto, nohead
requerido, 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 afind
para restringir aún más los archivos que obtienes. - La tubería a través de
head -1
filtrará 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.dirname
puede tomar una especificación de archivo completa y proporcionarle el bit de ruta.cd
solo 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]> _