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"
Suche 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, wären die Ergebnisse alle Dateien, die diese Anforderung erfüllen, daher wird die Größe 0 ignoriert.
Als Ergänzung zu den obigen Antworten:
Wenn Sie diese Dateien löschen möchten
find $dir -size 0 -type f -delete
Nein, Sie müssen sich nicht um grep kümmern.
find $dir -size 0 ! -name "*.xml"
So drucken Sie die Namen aller Dateien in und unterhalb von $dir der Größe 0:
find "$dir" -size 0
Beachten Sie, dass nicht alle Implementierungen von find
wird 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 jedes zweite Wort in einer Zeichenfolge zu durchlaufen und zu prüfen, ob die alternativen Werte Null sind, können Sie das Problem, das Sie mit Leerzeichen haben, teilweise beseitigen, indem Sie über Zeilen iterieren. zB:
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, und dies verstärkt 2 Punkte:Analysieren Sie ls
nicht , und haben eine vernünftige Benennungsrichtlinie, die keine Leerzeichen in Pfaden zulässt.
Zweitens, um die Daten aus der Schleife auszugeben, ist es nicht notwendig, die Ausgabe in einer Variablen zu speichern, nur in echo
es. Wenn Sie die Schleife einfach ihre Ausgabe auf stdout schreiben lassen, erreichen Sie dasselbe, vermeiden jedoch das Speichern.