Wie liste ich nur Dateien und keine Verzeichnisse eines Verzeichnisses auf?

86

Wie kann ich alle Dateien eines Ordners auflisten, jedoch nicht deren Ordner oder Unterdateien? Mit anderen Worten: Wie kann ich nur die Dateien auflisten?

Rodrigo
quelle

Antworten:

117

Verwenden von find:

find . -maxdepth 1 -type f

Durch die Verwendung der -maxdepth 1Option 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.

Carlpett
quelle
Nach meinem Kommentar zur Antwort von mklement0 wurde mir klar, dass "find ./*.png -maxdepth 1 -type f> pngs.txt" wahrscheinlich dasselbe erreichen würde. Es tut. Ohne ein Skript zu installieren.
Alex Hall
2
findAuf dem Mac gibt es weder Optionen -typenoch -maxdepthOptionen.
Timofey
1
@ Tim: -typeund -maxdepthsind 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.
mklement0
1
@AlexHall: Das ist eine clevere Lösung (obwohl ich vorschlagen , find *.png -maxdepth 0 -type fdas vermeiden ./Präfix in den Ausgabedateinamen, auch die Kenntnis -maxdepthvon 0nicht 1), solange alles , was Sie brauchen , ist die Dateinamen in alphabetischer Reihenfolge . Wenn Sie möchten, was Sie lssonst 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.
mklement0
1
Im Gegensatz dazu find * -maxdepth 0 -type f(eine Alternative, die aus dem Kommentar von @ AlexHall abgeleitet wurde) mit find . -maxdepth 1 -type fder 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.
mklement0
15
ls -p | grep -v /

Mit ls -p können Sie / nach dem Ordnernamen anzeigen, der als Tag zum Entfernen dient.

Dr_Hope
quelle
Es ist schön, ein Beispiel lszu 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.
Ben Amos
5
  • Die auf carlpett findbasierende 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 lsvielen Optionen anzuwenden .
    auch find immer findet versteckt auch Elemente , während das lsVerhalten auf das Vorhandensein oder Fehlen der abhängig -aoder -AOptionen.

    • 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
      
      • Obwohl dies das Präfixproblem behebt und Ihnen eine alphabetisch sortierte Ausgabe ermöglicht , haben Sie weder (Inline-) Kontrolle über die Aufnahme versteckter Elemente noch Zugriff auf lsdie 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 ,

  • ein Dienstprogramm, das die Ausgabeflexibilitätls bietet und gleichzeitig Typfilterfunktionen bietet ;
  • Einfach durch Platzieren von typfilternden Zeichen, z. B. ffür Dateien, dVerzeichnisse und lSymlinks, vor einer Liste von lsArgumenten (ausführen fls --helpoder fls --manum 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)

Installation

Unterstützte Plattformen

  • Bei der Installation aus der npm-Registrierung : Linux und macOS
  • Bei der manuellen Installation : jede Unix-ähnliche Plattform mit Bash

Aus der npm-Registrierung

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 :

Manuelle Installation

  • Laden Sie dieses bashSkript als herunter fls.
  • Machen Sie es ausführbar mit chmod +x fls.
  • Verschieben Sie es oder verknüpfen Sie es mit einem Ordner in Ihrem Ordner $PATH, z. B. /usr/local/bin(macOS) oder /usr/bin(Linux).
mklement0
quelle
1
Brillant. Auch wenn es darum geht, ein anderes Skript zu erstellen. Ich habe die von Ihnen verknüpfte Nur-Text-Quelle in eine Textdatei kopiert und eingefügt und sie in Cygwin mit dem folgenden Befehl ausgeführt: fls.sh f * .png> pngs.txt Und Bingo: Eine Liste von .png-Dateien ohne Pfade. Aber wirklich, ls hat keine Option, die mit dem "dir / b" -Schalter von DOS vergleichbar ist? Ich habe den Inhalt der Ausgabe von ls '--help durchgesehen, und zumindest ist nichts dergleichen vorhanden.
Alex Hall
1
@ AlexHall: Danke; tl; dr: try -1(die Nummer eins); lsDie 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 /bFall ist, wenn der Speicher dient), verwenden Sie die -1Option, 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.
mklement0
2

Auflisten des Inhalts eines Verzeichnisses ohne Unterverzeichnisse

Ich benutze gerne lsOptionen, 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 --colorund alle anderen. (Siehe ls --help)

Alles außer Ordnern auflisten

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 {} +

Nur Dateien auflisten :

oder

find /some/path -maxdepth 1 -type f

sortiert nach Größe:

find /some/path -maxdepth 1 -type f -exec ls -lSF --color {} +

Auflistung versteckter Einträge verhindern :

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/pathindem .auf der Liste für aktuelles Verzeichnis oder ..für übergeordnetes Verzeichnis .

F. Hauri
quelle
1

Sie können es auch lsmit grepoder verwenden egrepund als Alias ​​in Ihr Profil einfügen:

ls -l | egrep -v '^d'
ls -l | grep -v '^d'
Hans Roggeman
quelle
Ich würde dies aus dem oben genannten Grund nicht in ein Skript einfügen, sondern eine andere schnelle und schmutzige Lösung: ls -F | grep -v '/ $'
mooie
1

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!

Richard
quelle
Beeindruckend! Was ist, wenn Dateinamen Leerzeichen enthalten?
F. Hauri
Verwenden Sie "9-", um alles ab dem 9. Feld zu erhalten. Links sind ebenfalls davon betroffen, da sie nach dem 9. Feld stehen.
Richard
0
{ find . -maxdepth 1 -type f | xargs ls -1t | less; }

hinzugefügt xargs, damit es funktioniert, und verwendet, -1anstatt -lnur Dateinamen ohne zusätzliche lsInformationen anzuzeigen

Anabioz
quelle
Dies hat einige Vorteile, da es die Sortierung nach Zeit erzwingt, obwohl es wohl weniger ungeschickte Möglichkeiten gibt, dies mitfind -printf0 '...' | sort -z
Tripleee
-2

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.

Abhay
quelle
3
Dies verhält sich wahrscheinlich nicht so, wie Sie es erwarten! lsliest keine Standardeingabe, daher ist es sinnlos, irgendetwas an Pipe weiterzuleiten ls. Haben Sie vermissen xargs?
gniourf_gniourf
Anders ausgedrückt: Der findBefehl in dieser Antwort wird vollständig ignoriert . Der Gesamtbefehl ist derselbe wie ls -lt | less, der keine Typfilterung durchführt.
mklement0
1
Mit GNU findkönnte man das allerdings machen find . -maxdepth 1 -type f -ls. Es scheint auch unter Mac OS zu funktionieren, obwohl ich glaube -maxdepthund -lsnicht richtig portable Optionen sind.
Tripleee
-2

"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

Gill Davison
quelle
Die Verwendung von 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 echorichtig zitieren .
Tripleee