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
man find
.Antworten:
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
find
von 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
ls
und 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.quelle
-empty
Option.-type f
.find
Befehl nicht genug. Ich muss wirklich meine Angst überwinden, es herauszufinden. So nützlich.Als Ergänzung zu den obigen Antworten:
Wenn Sie diese Dateien löschen möchten
find $dir -size 0 -type f -delete
quelle
-exec /bin/rm {} \;
oder-exec /bin/rm {} +
wird auch an Nicht-GNU-find
Implementierungen arbeiten, die die Nicht-Standard-Erweiterung nicht unterstützen-delete
Nein, du musst dich nicht darum kümmern.
find $dir -size 0 ! -name "*.xml"
quelle
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.
quelle
-iname
ist auf einige nicht-GNU - Implementierungen nicht tragbarfind
Siehe hier für eine Liste von Standard - Optionen