Wie finde ich alle leeren Dateien und Ordner in einem bestimmten Verzeichnis, einschließlich Dateien, die nur leer aussehen, es aber nicht sind?

18

Angenommen, ich habe in meinem Ordner ~/listeine große Anzahl von Ordnern mit jeweils eigenen Unterordnern und Unterordnern usw., und auf jeder Ebene befinden sich fast jede Menge Dateien. Einige dieser Dateien und Ordner sind jedoch leer. Wie kann ich sie alle rekursiv durchsuchen, um die leeren Dateien und Ordner zu finden? Und lassen Sie sie dann in einer Liste mit Dateispeicherorten anzeigen, damit ich weiß, wo sich die einzelnen Speicherorte befinden (es sollte auch klar sein, welche Datei und welche ein Ordner ist, da nicht alle Dateien Dateierweiterungen aufweisen). Ich verwende Ubuntu GNOME 15.10 mit GNOME 3.18.

Bitte beachten Sie, dass es auch sehr nützlich wäre, wenn Sie mir mitteilen würden, ob eine Datei leer aussieht, dies aber nicht war (z. B. wenn Leerzeichen oder Zeilenumbrüche enthalten sind oder so). Und würde zwischen einer wirklich leeren Datei und einer Datei unterscheiden, die in der Ausgabe nur leer aussieht.


quelle
1
Eine leere Datei, ist eine Datei ohne Zeichen? (können Leerzeichen, Zeilenumbrüche und Tabulatoren sein)
Jacob Vlijm
@JacobVlijm: Früher dachte ich nur an Dateien mit 0 Bytes, aber jetzt, wo Sie es erwähnen, könnte jemand verrückt genug sein, mir eine Datei mit Leerzeichen oder Zeilenumbrüchen oder so etwas zu geben, also würde ich diese auch gerne erkennen. Ich möchte jedoch, dass die Ausgabe zwischen einer tatsächlich leeren Datei und einer Datei unterscheidet, die nur leer aussieht.

Antworten:

25

Von man find

    -empty File is empty and is either a regular file or a directory.

Es reicht also aus, leere Dateien und Verzeichnisse zu finden

find ~/lists -empty

Um den Typ anzugeben, können Sie den %yAusgabeformat-Bezeichner verwenden

          %y     File's type (like in ls -l), U=unknown type (shouldn't happen)

z.B

find ~/lists -empty -printf '%y %p\n'

oder nutzen Sie ein externes Programm wie ls, das eine --classifyOption enthält

    -F, --classify
          append indicator (one of */=>@|) to entries

dh

find ~/lists -empty -exec ls -Fd {} \;

Wenn Ihre Definition von "leer" so erweitert wird, dass sie nur Dateien mit Leerzeichen enthält, wird dies komplizierter und rechenintensiver, da Sie jetzt tatsächlich mindestens alle nicht leeren Dateien öffnen und deren Inhalt untersuchen müssen. Der effizienteste Weg, den ich mir aus der Vogelperspektive vorstellen kann, wäre so etwas wie

find ~/list \( -empty -o \( -type f -a ! -exec grep -qm1 '[^[:blank:]]' {} \; \) \) -exec ls -Fd {} \;

(entweder leer ODER eine Datei UND grep erkennt nicht mindestens ein nicht leeres Zeichen). Wahrscheinlich gibt es aber einen besseren Weg.

Stahlfahrer
quelle
Entschuldigung, ich habe etwas verpasst, bitte schauen Sie sich die bearbeitete Version meiner Frage an. Es sollte nicht zu viel sein, um hinzuzufügen.
11

Von ~/list Ordner:

find . -empty -type d

zum Auflisten leerer Verzeichnisse und

find . -empty -type f

zum Auflisten leerer Dateien.

find . -type f -exec bash -c 'if [ `cat "{}" |wc -w` -eq 0 ]; then echo "file - {}";fi' \; -or -empty -exec bash -c "echo dir - {}" \; 

zum Auflisten leerer Ordner und Dateien, einschließlich Leerzeichen und Leerzeilen

EdiD
quelle
Und werden dann auch Unterordner und deren Inhalte rekursiv aufgelistet?
Dies zeigt rekursiv leere Dateien und Ordner
EdiD
Entschuldigung, ich habe etwas verpasst, bitte schauen Sie sich die bearbeitete Version meiner Frage an. Es sollte nicht zu viel sein, um hinzuzufügen.
[ `grep -c [[:alnum:]] "{}"` -eq 0 ]Lässt Dateien durch, die nur Zeichen enthalten, die nicht im [A-Za-z0-9]Satz enthalten sind.
Kos
@kos - wahrscheinlich Graph statt Alnum wird die Arbeit
erledigen