Ich weiß, dass ich dies tun kann, um eine Liste der Verzeichnisnamen zu erhalten:
find . -type d -maxdepth 1
Die Ausgabe sieht folgendermaßen aus:
.
./foo
./bar
Ich bevorzuge die Auflistung ohne ./
. Gibt es eine Möglichkeit zu finden, um nur die Rohnamen auszugeben?
Ich habe versucht, die Liste an stat zu senden, um sie zu formatieren, aber das führt zu demselben Ergebnis:
find . -type d -maxdepth 1 -print0 | xargs -0 stat -f '%N'
foo bar ...
alles auf einer leitung ohne die./
vor?Antworten:
Mit GNU können
find
Sie die-printf
Option verwenden:Wie von Paweł in den Kommentaren vermerkt, wenn Sie nicht möchten, dass das aktuelle Verzeichnis aufgelistet wird, fügen Sie Folgendes hinzu
-mindepth 1
:quelle
-printf
Option in der neuesten POSIX-Spezifikation nicht erwähnen und frage mich, wie portabel sie ist ...printf
Optionen wird von POSIX erwähnt und scheint von einigen anderenfind
Versionen nicht unterstützt zu werden . GNU find kann an den meisten Orten installiert werden, ist also in diesem Sinne portabel.-mindepth 1
.
Aktualisieren:
Eine kürzere Alternative:
Gibt Ihnen die Namen, einen pro Zeile, ohne Schrägstriche
quelle
ls
. Gleichzeitig hatte ich einen Link gepostet, warum dies eine schlechte Idee für eine andere Antwort ist, die seitdem gelöscht wurde. Zu der Zeit gab es nur 2 Antworten und der Grund schien offensichtlich. Ich bin froh, dass Sie auf die Mehrdeutigkeit hingewiesen haben, und hier ist meine Erklärung. Ich habe meine Gegenstimme in eine Gegenstimme umgewandelt, weil ich Ihrer aktuellen Antwort zustimme.\n
Stellen Sie sich vor, es gibt einen in einem Verzeichnis, den Sie nicht mit cut abrufen können (was Sie getan haben, als ich Sie abgelehnt habe). Es gibt nur wenige Fälle, in denen sichls
das nicht gefährlich verhält, und es ist fast immer sicherer, einen anderen Weg zu wählen.Mit GNU find können Sie -mindepth verwenden, um zu verhindern, dass die Suche mit dem aktuellen Verzeichnis übereinstimmt:
Da Sie dies nicht rekursiv tun, können Sie einen Bash-Glob verwenden:
Durch das Hinzufügen eines abschließenden / zu einem Glob werden nur Verzeichnisse abgeglichen.
quelle
*/
vermisst Punktedateien und enthält Symlinks. Dies kann ein Problem sein oder auch nicht.Lassen Sie uns
sed
diese beiden Zeichen entfernen:quelle
Ich würde lieber verwenden:
quelle
Ich benutze normalerweise:
Aber ich weiß nicht, ob es der richtige Weg ist, das zu tun, was Sie wollen.
quelle
echo */
würde das selbe tun, mehr oder weniger (es fehlen dot files und symlinks), aber dann würde joachim fragen, wie man das final entfernt/
.Unter AIX funktioniert der Parameter 'maxdepth' nicht.
Im Allgemeinen funktioniert das für mich:
find ./ -type d | cut -d"/" -f2 | sort -u
quelle
Was Sie suchen, heißt
basename
, es ignoriert die Unix-VerzeichnisstrukturBeispiel unten:
find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;
Es schließt für die Ausgabe sogar den Pfad dir aus, so dass es nicht mehr erforderlich ist,
cd
den Befehl auszuführenEinige zusätzliche Informationen:
Ich würde
-exec
als Argument übergeben, um stattdessen einen|
anderen Befehl für die Ausgabe zu finden (um zu vermeiden, dass der zweite Befehl über jede Ausgabezeile geht, obwohl dies je nach Ausgabe die Leistung des Skripts verbessern könnte).HINWEIS: Die
find
Optionen sind nicht positionsabhängig (-maxdepth wirkt sich sowohl auf die zuvor als auch nachher angegebenen Tests aus).quelle