Scheint ohne Ausgabeänderung nicht möglich zu sein, aber hier ist ein einfacher alternativer Weg:
find source/ -type f
Oder (spezifisch für GNU find), um nur Dateien in der Tiefe Ihrer Frage zu erhalten:
find source/ -type f -mindepth 2 -maxdepth 2
(oder wenn Sie Verzeichnisse wie ls möchten gibt, entferne -type f )
Du kannst einfach bei ls bleiben, wenn du ein paar Psychedlics hinzufügst (ls -d ):
# mkdir test
# cd test
# mkdir A B C
# touch {A,B,C}/file*
# ls -d */*
A/file B/file C/file
Vielleicht interessiert Sie „der find des armen Mannes “:
shopt -s globstar
shopt -s s setzt die benannte(n) Shell-Option(en). Die globstar option ist in bash(1) wie folgt definiert:
Wenn gesetzt, das Muster ** Wird in einem Dateinamen/Pfadnamen-Erweiterungskontext verwendet, stimmt dies mit einer Datei [sic] überein undnull oder mehr Verzeichnisse und Unterverzeichnisse. Wenn dem Muster ein / folgt , nur Verzeichnisse und Unterverzeichnisse stimmen überein.
Also, nachdem Sie shopt -s globstar erledigt haben , einen der folgenden Befehle:
ls -d1 -- source/** # The character after the ‘d’ is the digit one. ls -d -- source/** | cat # i.e., it will write that into a pipe to any command. printf "%s\n" source/**
erzeugt die Ausgabe:
source/
source/fonts
source/fonts/fontello
source/images
source/images/bg1.png
source/images/eng.png
source/images/fra.png
Leider gehören dazu auch die Verzeichnisnamen. Es könnte Ihnen ein wenig helfen das zu wissen
printf "%s\n" source/**/
erzeugt die Ausgabe:
source/
source/fonts
source/images
d.h. nur die Verzeichnisnamen. Sie können die Ausgabe eines der ersten Befehle in eine Datei umleiten, die Ausgabe des obigen Befehls in eine zweite Datei umleiten und dann comm verwenden , diff , oder etwas Ähnliches, um die zweite Datei von der ersten zu subtrahieren, wobei nur die einfachen Dateien (keine Verzeichnisse) übrig bleiben. Aber tun Sie das nicht.
Ein anderer Ansatz (das ist nicht viel besser) ist
ls -d --file-type -- source/** | grep -v '/$'
Die --file-type Option sagt ls um einen / anzuzeigen am Ende jedes Verzeichnisnamens (und andere Zeichen am Ende anderer (spezieller) Dateitypen), wie folgt:
source// # Added an extra one source/fonts/ # Added one source/fonts/fontello source/images/ # Added one source/images/bg1.png source/images/eng.png source/images/fra.png
und dann die grep -v '/$' entfernt die Zeilen, die mit / enden;d.h. die Verzeichnisnamen. Leider ist die --file-type Option wird von POSIX nicht angegeben. Wenn Ihre Version von ls nicht unterstützt, verwenden Sie -F . Das ist wie --file-type außer es wird auch ein * angezeigt am Ende der Namen von ausführbaren Dateien, was manche Leute als störend empfinden. Sie können sie mit sed beseitigen :
ls -dF -- source/** | sed -e '/\/$/d' -e 's/\*$//'
Wenn Sie etwas mit allen Dateien (und nur den Dateien) machen wollen, können Sie das tun
for f in source/**
do
if [ -f "$f" ]
then
Insert commands to be applied to plain files here.
fi
done Anmerkungen:
- Wenn
lsan ein Terminal ausgibt und nicht in-list (l ong)-Modus schreibt es mehrere Namen pro Zeile (es sei denn, die Namen sind sehr lang). Sie können es zwingen, einen Namen pro Zeile zu schreiben, indem Sie-1angeben (eins) oder durch Umleiten der Ausgabe in eine Datei oder eine Pipe. - Wahrscheinlich brauchen Sie den
--nicht wirklich imlsBefehle, da Sie ein Verzeichnis auflisten, dessen Inhalt Sie erstellt haben. Sie sollten es verwenden, wenn Sie*auflisten in einem unbekannten Verzeichnis, als Schutz vor Dateinamen, die mit-beginnen . - Versuchen Sie nicht, die Ausgabe von
lszu parsen . - Der
globstarShell-Option scheint nicht von POSIX definiert zu sein. (Tatsächlich bin ich mir nicht sicher, ob POSIX jeden erkennt Shell-Optionen.) Es scheint zwar einbashzu sein ism, Vorsicht – es ist möglicherweise nicht in allen Versionen von bash vorhanden. -
Wenn
fontsoderimageshat Unterverzeichnisse,**listet sie alle rekursiv bis ganz nach unten auf. Eine (etwas klobige und unzuverlässige) Möglichkeit, die Tiefe zu begrenzen, istls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'wodurch Zeilen entfernt werden, die drei oder mehr
/enthalten Zeichen.