Wie schließe ich Verzeichnisse beim Auflisten von Dateien aus?

21

Wie schließe ich Verzeichnisse aus, wenn ich Dateien im aktuellen Verzeichnis aufliste?

ls .

^ schließt Verzeichnisse in die Auflistung ein.

Stephen Watkins
quelle

Antworten:

23

Probier diese:

find . -maxdepth 1 -not -type d
Alexander Gladysh
quelle
3
halte es einfach: $ find. -type f
jamzed
9
Nein. (1) Es wäre rekursiv. (2) Es würde keine Symlinks auflisten. @Steve fragte nach Äquivalent ls .ohne Verzeichnisse - und hier ist es.
Alexander Gladysh
2
Hinzufügen -lsoder -exec ls -l {} \;würde es gerne ls -lohne Verzeichnisse machen.
Ladadadada
15

Um genau das ls .Gleiche zu erreichen , müssen Sie keine versteckten Verzeichnisse anzeigen.

find . -maxdepth 1 -not -type d -and -not -name '.*'

und das lässt Sie immer noch mit './' vor jedem Dateinamen. Das ist kein wirkliches Problem, aber ich finde es irgendwie hässlich. Ich ging mit:

ls -p | grep -v '/$'

Dadurch erhalten Sie eine Auflistung, die gleich aussieht, und Sie können zusätzliche lsArgumente hinzufügen . --color=alwaysFüge ein hinzu und du bekommst deine Farben zurück oder -asiehst versteckte Dateien.

Ich mag Alexanders Antwort, weil er tatsächlich von einem Dateisystem abhängt, das für die betreffende Datei charakteristisch ist, damit er sich niemals täuschen lässt. Meine Antwort wird von einer Datei getäuscht, deren Name als letztes Zeichen ein '/' enthält. Aber das scheint, als würde es um Ärger bitten.

Sean O'Leary
quelle
1
'-not' ist GNU-bezogen, da es nicht POSIX-konform ist. Es ist besser, diese Optionen nicht zu lehren, da ein Benutzer "schlechte" Gewohnheiten haben und sich auf anderen UNIX-Systemen verloren fühlen könnte :)
Systemen jirib
2
@JiriXichtkniha was ist die POSIX-Alternative zu -not?
Lucas Gallindo
5

Versuche dies:

$ find. -Typ f -maxtiefe 1

oder dieses:

$ ls -p | egrep -v / $

$ ls -la | egrep -v ^ d

jamzed
quelle
3

Es ist zwar ein alter Beitrag, aber ich dachte, das könnte helfen ..

$ ls -l | grep -v ^ d

Es werden alle Dateien aufgelistet, einschließlich Symlinks, Zeichen- und Blockdateien.

sandeep.s85
quelle
Diese Antwort wurde bereits vor über einem Jahr von jamzed (mit diesem visuellen Geräusch) gegeben.
Alexx Roche
2

Die obigen "Find" -Lösungen verlieren einige der Funktionen von ls - zum Beispiel: Nur Dateien auflisten, sortiert in absteigender Änderungszeit.

Die "ls -p | grep" -Antworten befassen sich nicht elegant mit anderen Elementen von ls wie -R, falls sie gewünscht werden sollten

Die folgende Antwort, während ausführliche, meiner Meinung nach spiegelt das wahrste ls Verhalten und höchste Flexibilität für die Auswahl von „Dateien nur“

ls -t . | while read line; do
  if [ -f $line ]; then
    echo $line
  fi 
done

Ersetzen Sie einfach die ls-Schalter wie gewünscht und das Ergebnis wird nur mit Dateien zurückgegeben. Wenn auch Verknüpfungen und andere Elemente erforderlich sind, müssten geringfügige Nacharbeiten durchgeführt werden, um die Aufnahme zu überprüfen.

Pancho
quelle
0
ls $(file --no-pad  -F' '  * | grep -v directory | cut -d' ' -f1)

Hiermit können Sie noch alle anderen Optionen verwenden, die lsnormalerweise in Anspruch genommen werden. Oder ... entfernen, -vum nur Verzeichnisse aufzulisten. Oder ... ersetzen Sie das Verzeichnis durch einen anderen Dateityp, der fileASCII, leer, ELF usw. versteht und meldet.

Kaulbach
quelle
Dies funktioniert nicht, wenn einer der aufgelisteten Dateinamen Leerzeichen enthält.
Psychonaut
ls -t .|while read f;do [ -f "$f" ]&& echo $f;doneist in meinen Tests ungefähr 3x schneller
Alexx Roche
0

Ich befand mich auf einem System, das die findBinärdatei nicht unterstützte, -notund verwendete schließlich:

ls|while read f;do [ -f "$f" ]&& echo $f;done

Vorteile: Verlässt sich nicht auf etwas anderes als sh ls echo
Ist kompatibel mit Bash und Dash.
Kann geändert werden, um mit anderen Dingen (z. B. Verzeichnissen) übereinzustimmen, indem -f
Is am schnellsten geändert wird als einige der Antworten. Benötigt weniger RAM und CPU

Alexx Roche
quelle