Suchen Sie alle Null-Byte-Dateien in Verzeichnissen und Unterverzeichnissen

81

Wie finde ich alle Null-Byte-Dateien in einem Verzeichnis und seinen Unterverzeichnissen?

Ich hab's gemacht:

#!/bin/bash
lns=`vdir -R *.* $dir| awk '{print $8"\t"$5}'`
temp=""
for file in $lns; do
    if test $file = "0"; then
        printf $temp"\t"$file"\n"
    fi
    temp=$file
done

Ich erhalte jedoch nur Ergebnisse im aktuellen Verzeichnis, keine Unterverzeichnisse. Wenn ein Dateiname ein Leerzeichen enthält, wird nur das erste Wort gefolgt von der Registerkarte angezeigt

Civa
quelle
Vielleicht möchten Sie lesen man find.
Alk
Frage auch unter Unix & Linux gepostet - bitte poste die gleiche Frage nicht an mehreren Stellen.
Glenn Jackman
Das nächste Mal werde ich aufgrund eines Problems in meinem Browser mit Stackoverflow nicht so wiederholen. Ich habe im Superuser gepostet, aber jetzt wurde das Problem durch Löschen von Verlaufs-Cookies und Catche behoben, dh ich habe hier erneut gefragt
Civa

Antworten:

173

So drucken Sie die Namen aller Dateien in und unter $ dir der Größe 0:

find "$dir" -size 0

Beachten Sie, dass nicht alle Implementierungen findvon standardmäßig eine Ausgabe erzeugen. Daher müssen Sie möglicherweise Folgendes tun:

find "$dir" -size 0 -print

Zwei Kommentare zur letzten Schleife in der Frage:

Anstatt über jedes andere Wort in einer Zeichenfolge zu iterieren und zu prüfen, ob die alternativen Werte Null sind, können Sie das Problem mit Leerzeichen teilweise beseitigen, indem Sie über Zeilen iterieren. z.B:

printf '1 f1\n0 f 2\n10 f3\n' | while read size path; do
    test "$size" -eq 0 && echo "$path"; done

Beachten Sie, dass dies in Ihrem Fall fehlschlägt, wenn einer der von ls ausgegebenen Pfade Zeilenumbrüche enthält. Dies verstärkt 2 Punkte: Nicht analysieren lsund eine vernünftige Benennungsrichtlinie verwenden, die keine Leerzeichen in Pfaden zulässt.

Zweitens ist es zur Ausgabe der Daten aus der Schleife nicht erforderlich, die Ausgabe in einer Variablen nur dafür zu speichern echo. Wenn Sie die Schleife einfach ihre Ausgabe in stdout schreiben lassen, erreichen Sie dasselbe, vermeiden jedoch das Speichern.

William Pursell
quelle
Kann ich ein anderes Verzeichnis als * .xml
filtern
2
Es gibt auch eine bequeme -emptyOption.
Wesley Baugh
@WesleyBaugh mit -empty Option erhalten Sie auch Verzeichnisse mit null Dateien im Inneren
Igor Scabini
1
@IgorScabini Wenn Sie sich auf Dateien beschränken möchten, können Sie dies tun -type f.
Wesley Baugh
Schön! Einfach und auf den Punkt. Mann, ich benutze diesen findBefehl nicht genug. Ich muss wirklich meine Angst überwinden, es herauszufinden. So nützlich.
racl101
32

Als Ergänzung zu den obigen Antworten:

Wenn Sie diese Dateien löschen möchten

find $dir -size 0 -type f -delete
LinuxLuigi
quelle
1
Es ist nicht erforderlich, die gesamte Datei der Größe 0 ständig zu löschen.
Raghvendra
dann, wie man eine Datei in einem Ordner mit Größe 0
löscht
-exec /bin/rm {} \;oder -exec /bin/rm {} +wird auch an Nicht-GNU- findImplementierungen arbeiten, die die Nicht-Standard-Erweiterung nicht unterstützen-delete
Gert van den Berg
8

Nein, du musst dich nicht darum kümmern.

find $dir -size 0 ! -name "*.xml"
Batcher
quelle
3

Bash 4+ getestet - Dies ist der richtige Weg, um nach Größe 0 zu suchen:

find /path/to/dir -size 0 -type f -name "*.xml"

Suchen Sie nach mehreren Dateierweiterungen der Größe 0:

find /path/to/dir -size 0 -type f \( -iname \*.css -o -iname \*.js \)

Hinweis: Wenn Sie das \ (... \) entfernen, werden alle Dateien angezeigt, die diese Anforderung erfüllen, sodass die Größe 0 ignoriert wird.

Mike Q.
quelle
-inameist auf einige nicht-GNU - Implementierungen nicht tragbar findSiehe hier für eine Liste von Standard - Optionen
Gert van den Berg