Folgendes sollte sicherer sein:
cd -- "$(find / -name ls -type f -printf '%h' -quit)"
Vorteile:
- Der doppelte Bindestrich verhindert die Interpretation eines Verzeichnisnamens, der optional mit einem Bindestrich beginnt (
find
erzeugt keine solchen Dateinamen, ist aber nicht schädlich und könnte für ähnliche Konstrukte erforderlich sein) -name
überprüfen Sie vor-type
überprüfen, da letzteres manchmal einenstat
erfordert- Nein
dirname
erforderlich, da der%h
Bezeichner gibt bereits den Verzeichnisnamen aus -quit
um die Suche nach der ersten gefundenen Datei zu stoppen, also keinhead
erforderlich, was dazu führen würde, dass das Skript bei Verzeichnisnamen mit Zeilenumbrüchen fehlschlägt
Sie können etwas verwenden wie:
pax[/home/pax]> cd "$(dirname "$(find / -type f -name ls | head -1)")"
pax[/usr/bin]> _
Dadurch wird die erste ls
gefunden reguläre Datei und wechseln Sie dann in dieses Verzeichnis.
In Bezug darauf, was jedes Bit tut:
- Die Suche beginnt bei
/
und suchen Sie nach unten und listen Sie alle regulären Dateien auf (-type f
) namensls
(-name ls
). Es gibt andere Dinge, die Sie zufind
hinzufügen können um die erhaltenen Dateien weiter einzuschränken. - Die Leitung durch
head -1
wird alles außer dem ersten herausfiltern. $()
ist eine Möglichkeit, die Ausgabe eines Befehls zu nehmen und sie für einen anderen auf die Befehlszeile zu setzen Befehl.dirname
kann eine vollständige Dateispezifikation nehmen und Ihnen das Pfadbit geben.cd
wechselt einfach in dieses Verzeichnis.
Wenn Sie jedes Bit nacheinander ausführen, können Sie sehen, was passiert:
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]> _