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 (
finderzeugt 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 einenstaterfordert- Nein
dirnameerforderlich, da der%hBezeichner gibt bereits den Verzeichnisnamen aus -quitum die Suche nach der ersten gefundenen Datei zu stoppen, also keinheaderforderlich, 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 zufindhinzufügen können um die erhaltenen Dateien weiter einzuschränken. - Die Leitung durch
head -1wird 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.dirnamekann eine vollständige Dateispezifikation nehmen und Ihnen das Pfadbit geben.cdwechselt 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]> _