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


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.


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

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"

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.


-inameist auf einige nicht-GNU - Implementierungen nicht tragbar findSiehe hier für eine Liste von Standard - Optionen
Gert van den Berg
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.