Wie kann ich mit ls nur nicht leere Dateien auflisten?

36

Wie kann ich lsunter Linux alle Dateien auflisten (verwenden ), die nicht leer sind (Größe> 0)?

David B
quelle

Antworten:

49

Ich würde find dirname -not -empty -lsunter der Annahme, GNU finden.

Daenyth
quelle
1
Möchte jemand die Ablehnung erklären?
Daenyth,
Wahrscheinlich, weil der Fragesteller darum gebeten hat lsund du es benutzt hast find;) Ich habe es jedoch erhöht ... Es ist eine richtige Lösung
BloodPhilia
2
Wenn Sie "find. -Not -empty -ls" verwenden, wird auch das aktuelle Verzeichnis einbezogen (dh "." In der Ausgabe). Um nur die aktuellen Dateien einzubeziehen, verwenden Sie "find. -Type f -not -empty -ls".
User672009
19

Dies ist ein Job, bei dem man herausfindet, dass er nicht mächtig genug ist.

find -maxdepth 1 -size +0 -print

-maxdepth 1 - Dies weist find an, nur das aktuelle Verzeichnis zu durchsuchen, zu entfernen, um in allen Unterverzeichnissen zu suchen, oder die Zahl zu ändern, um 2, 3 oder mehr Ebenen zu verringern.

-size +0Dies weist find an, nach Dateien mit einer Größe von mehr als 0Bytes zu suchen . 0kann zu jeder möglicher Größe geändert werden, die Sie wünschen würden.

-print weist find an, den vollständigen Pfad zu der gefundenen Datei auszudrucken

Bearbeiten:
Späte Hinzufügung: Sie sollten wahrscheinlich auch den -type fobigen Schalter hinzufügen . Dies weist find an, nur Dateien zu finden. Und wie in den Kommentaren unten erwähnt, wird der -printSchalter nicht wirklich benötigt.

Nifle
quelle
1
Um eine Warnung zu vermeiden, sollten Sie -maxdepth 1vorher platzieren -size +0. Auch -printist die Standardaktion, so dass es nicht erforderlich ist.
CYRUS
@ Cyrus - Keine Warnungen für mich (Cygwin)
Nifle
Die Implementierungen findvariieren stark in Bezug auf die gültigen Optionen und die möglichen Ziele. GNU find(was furchtbar häufig vorkommt) wird eine Warnung ausgeben , wenn Sie es -sizevorher setzen -maxdepth.
Telemachus
10

find dirname -type f ! -empty

Joril
quelle
8
ls -l | awk '{if ($5 != 0) print $9}'

Wenn Sie beabsichtigen zu verwenden ls, benötigen Sie ein wenig Hilfe von awk.

MaQleod
quelle
7

Ls hat fast keine Möglichkeit, Dateien zu filtern: Das ist nicht seine Aufgabe. Das Filtern von Dateien ist die Aufgabe der Shell für einfache Fälle (durch Globbing) und das Suchen für komplexe Fälle.

In zsh können Sie das LGlobbing-Qualifikationsmerkmal so einstellen, dass nur Dateien mit einer Größe von> 0 erhalten bleiben (das .Qualifikationsmerkmal beschränkt sich auf reguläre Dateien):

ls *(.L+0)

Benutzer anderer Shells müssen find verwenden. Mit GNU find (wie meistens unter Linux):

find -maxdepth 1 -type f ! -empty -exec ls {} +

Ein POSIX-konformer Weg ist:

find . -type f -size +0c -exec ls {} + -o -name . -o -prune

Wenn lsnicht nur ein Beispiel und Sie lediglich die Absicht , visuelle Inspektion, könnten Sie sortieren nach Größe: ls -S.

Gilles 'SO - hör auf böse zu sein'
quelle
3
 $ find /* -type f ! -size 0

funktioniert besser, wenn Sie nicht nur Verzeichnisse, sondern alle nicht leeren Dateien möchten.

Trezoid
quelle
1

Bash 4.0+

shopt -s globstar
shopt -s nullglob
for file in **/*; do  test -f "$file" && [[ -s "$file" ]] && echo "$file"; done
user31894
quelle