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
ls
an ein Terminal ausgibt und nicht in-l
ist (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-1
angeben (eins) oder durch Umleiten der Ausgabe in eine Datei oder eine Pipe. - Wahrscheinlich brauchen Sie den
--
nicht wirklich imls
Befehle, 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
ls
zu parsen . - Der
globstar
Shell-Option scheint nicht von POSIX definiert zu sein. (Tatsächlich bin ich mir nicht sicher, ob POSIX jeden erkennt Shell-Optionen.) Es scheint zwar einbash
zu sein ism, Vorsicht – es ist möglicherweise nicht in allen Versionen von bash vorhanden. -
Wenn
fonts
oderimages
hat 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.