Wie kann ich alle Dateien eines Ordners auflisten, jedoch nicht deren Ordner oder Unterdateien? Mit anderen Worten: Wie kann ich nur die Dateien auflisten?
Wie kann ich alle Dateien eines Ordners auflisten, jedoch nicht deren Ordner oder Unterdateien? Mit anderen Worten: Wie kann ich nur die Dateien auflisten?
Antworten:
Verwenden von find
:
find . -maxdepth 1 -type f
Durch die Verwendung der -maxdepth 1
Option wird sichergestellt, dass Sie nur im aktuellen Verzeichnis suchen (oder, wenn Sie das .
durch einen Pfad ersetzen , in diesem Verzeichnis). Wenn Sie eine vollständige rekursive Liste aller Dateien in diesem und in den Unterverzeichnissen wünschen, entfernen Sie einfach diese Option.
find
Auf dem Mac gibt es weder Optionen -type
noch -maxdepth
Optionen.
-type
und -maxdepth
sind keine Optionen im normalen Sinne; BSD find
(wie unter OS X verwendet) nennt sie primär und muss nach den Dateinamenoperanden stehen ( .
in diesem Fall; beachten Sie, dass die BSD-Version im Gegensatz zu Linux mindestens einen expliziten Dateinamenoperanden benötigt). Der Befehl in dieser Antwort funktioniert definitiv auf einem Mac.
find *.png -maxdepth 0 -type f
das vermeiden ./
Präfix in den Ausgabedateinamen, auch die Kenntnis -maxdepth
von 0
nicht 1
), solange alles , was Sie brauchen , ist die Dateinamen in alphabetischer Reihenfolge . Wenn Sie möchten, was Sie ls
sonst noch tun können (anderes Ausgabeformat / Reihenfolge, Inline-Kontrolle darüber, ob versteckte Elemente enthalten sind oder nicht), ergänzt durch Filterung vom Typ [Multi], kann das Skript aus meiner Antwort helfen.
find * -maxdepth 0 -type f
(eine Alternative, die aus dem Kommentar von @ AlexHall abgeleitet wurde) mit find . -maxdepth 1 -type f
der Antwort: find . ...
Enthält immer versteckte Elemente, stellt Ausgabedateinamen immer voran ./
und gibt bei GNU find
(Linux) normalerweise eine unsortierte Liste aus. find * ...
Da die Shell von vornherein Globbing ausführen kann, werden versteckte Elemente standardmäßig ausgeschlossen (können mit geändert werden shopt -s dotglob
), und es werden lediglich Dateinamen (kein Präfix) ausgegeben, die alphabetisch sortiert sind. Keiner der beiden Ansätze enthält Symlinks zu Dateien. Verwenden Sie dazu die Option -L
.
ls -p | grep -v /
Mit ls -p können Sie / nach dem Ordnernamen anzeigen, der als Tag zum Entfernen dient.
ls
zu sehen find
, das zusätzlich zu verwendet , da letzteres relative Pfade und erstere nur Dateinamen zurückgibt. Verwenden Sie das richtige Werkzeug für den Job.
Die auf carlpett find
basierende Antwort ( find . -maxdepth 1 -type f
) funktioniert im Prinzip, entspricht jedoch nicht ganz der Verwendung von ls
: Sie erhalten eine möglicherweise unsortierte Liste von Dateinamen, denen alle vorangestellt sind./
, und Sie verlieren die Möglichkeit, die ls
vielen Optionen anzuwenden .
auch find
immer findet versteckt auch Elemente , während das ls
Verhalten auf das Vorhandensein oder Fehlen der abhängig -a
oder -A
Optionen.
Eine Verbesserung , die Alex Hall in einem Kommentar zu dieser Frage vorgeschlagen hat, besteht darin , Shell Globbingfind
zu kombinieren mit :
find * -maxdepth 0 -type f # find -L * ... includes symlinks to files
ls
die vielen anderen Sortier- / Ausgabeformatoptionen.Die Antwort von Hans Roggeman ls
+grep
ist pragmatisch, sperrt Sie jedoch in die Verwendung des Long ( -l
) - Ausgabeformats .
Um diese Einschränkungen zu adressieren ich das schrieb fls
( f iltering ls ) Dienstprogramm ,
ls
bietet und gleichzeitig Typfilterfunktionen bietet ;f
für Dateien, d
Verzeichnisse und l
Symlinks, vor einer Liste von ls
Argumenten (ausführen fls --help
oder fls --man
um weitere Informationen zu erhalten).Beispiele:
fls f # list all files in current dir.
fls d -tA ~ # list dirs. in home dir., including hidden ones, most recent first
fls f^l /usr/local/bin/c* # List matches that are files, but not (^) symlinks (l)
Unterstützte Plattformen
Hinweis: Auch wenn Sie Node.js nicht verwenden npm
, funktioniert der Paketmanager plattformübergreifend und ist einfach zu installieren. Versuchen
curl -L https://git.io/n-install | bash
Mit Node.js installiert ist , müssen Sie wie folgt vor :
[sudo] npm install fls -g
Hinweis :
Ob Sie dies benötigen, sudo
hängt davon ab, wie Sie Node.js / io.js installiert haben und ob Sie die Berechtigungen später geändert haben . Wenn Sie eine EACCES
Fehlermeldung erhalten, versuchen Sie es erneut mit sudo
.
Das -g
sorgt für weltweite Installation und benötigt wird , um setzen fls
in Ihrem System $PATH
.
bash
Skript als herunter fls
.chmod +x fls
.$PATH
, z. B. /usr/local/bin
(macOS) oder /usr/bin
(Linux).-1
(die Nummer eins); ls
Die Standardeinstellung ist "nackte" Ausgabe, dh nur Dateinamen. Bei der Ausgabe an ein Terminal wird jedoch ein spaltenbasiertes Layout verwendet (mehrere Dateinamen pro Zeile). Um einen Dateinamen pro Ausgabezeile (das ist , was der dir /b
Fall ist, wenn der Speicher dient), verwenden Sie die -1
Option, die auf tatsächlich implizit ist , wenn sich stdout nicht mit einem Terminal verbunden, wie wenn sie an einem Rohr oder einer Ausgabedatei zu senden.
Ich benutze gerne ls
Optionen, zum Beispiel:
-l
Verwenden Sie ein langes Listenformat-t
Sortieren nach Änderungszeit, neueste zuerst-r
umgekehrte Reihenfolge beim Sortieren-F
,--classify
Kennzeichen (eines von * / => @ |) an Einträge anhängen-h
,--human-readable
mit -l und -s, Druckgrößen wie 1K 234M 2G usw.
Irgendwann --color
und alle anderen. (Siehe ls --help
)
Dies zeigt Dateien, Symlinks, Geräte, Pipe, Sockets usw. an.
damit
find /some/path -maxdepth 1 ! -type d
könnte leicht nach Datum sortiert werden:
find /some/path -maxdepth 1 ! -type d -exec ls -hltrF {} +
oder
find /some/path -maxdepth 1 -type f
sortiert nach Größe:
find /some/path -maxdepth 1 -type f -exec ls -lSF --color {} +
Um keine versteckten Einträge anzuzeigen, bei denen der Name mit einem Punkt beginnt, können Sie Folgendes hinzufügen ! -name '.*'
:
find /some/path -maxdepth 1 ! -type d ! -name '.*' -exec ls -hltrF {} +
Dann
Sie könnten ersetzen , /some/path
indem .
auf der Liste für aktuelles Verzeichnis oder ..
für übergeordnetes Verzeichnis .
Sie können es auch ls
mit grep
oder verwenden egrep
und als Alias in Ihr Profil einfügen:
ls -l | egrep -v '^d'
ls -l | grep -v '^d'
Dateien suchen: ls -l / home | grep "^ -" | tr -s '' | cut -d '' -f 9
Verzeichnisse finden: ls -l / home | grep "^ d" | tr -s '' | cut -d '' -f 9
Links finden: ls -l / home | grep "^ l" | tr -s '' | cut -d '' -f 9
tr -s '' wandelt die Ausgabe in eine durch Leerzeichen getrennte Datei um. Der Befehl cut gibt an, dass das Trennzeichen ein Leerzeichen ist, und gibt das 9. Feld zurück (immer den Dateinamen / Verzeichnisnamen / Linknamen).
Ich benutze das die ganze Zeit!
{ find . -maxdepth 1 -type f | xargs ls -1t | less; }
hinzugefügt xargs
, damit es funktioniert, und verwendet, -1
anstatt -l
nur Dateinamen ohne zusätzliche ls
Informationen anzuzeigen
find -printf0 '...' | sort -z
Ich füge nur die Antwort von Carlpett hinzu. Für eine sehr nützliche Ansicht der Dateien können Sie die Ausgabe an ls weiterleiten.
find . -maxdepth 1 -type f|ls -lt|less
Zeigt die zuletzt geänderten Dateien in einem Listenformat an. Dies ist sehr nützlich, wenn Sie viele Dateien heruntergeladen haben und eine übersichtliche Version der letzten Dateien anzeigen möchten.
ls
liest keine Standardeingabe, daher ist es sinnlos, irgendetwas an Pipe weiterzuleiten ls
. Haben Sie vermissen xargs
?
find
Befehl in dieser Antwort wird vollständig ignoriert . Der Gesamtbefehl ist derselbe wie ls -lt | less
, der keine Typfilterung durchführt.
find
könnte man das allerdings machen find . -maxdepth 1 -type f -ls
. Es scheint auch unter Mac OS zu funktionieren, obwohl ich glaube -maxdepth
und -ls
nicht richtig portable Optionen sind.
"find '-maxdepth'" funktioniert nicht mit meiner alten Version von bash, daher benutze ich:
für f in $ (ls); tun, wenn [-f $ f]; dann echo $ f; fi; getan
for f in $(ls)
ist doppelt falsch. Sie könnten das mit beheben, for f in *
aber dann würde es kaputt gehen, weil Sie das Argument nicht echo
richtig zitieren .