Dateien mit einer Größe von 0 Byte über die Befehlszeile entfernen?

16

Also habe ich ein Verzeichnis mit anderen Verzeichnissen erstellt und mich gefragt, ob es möglich ist, Dateien ohne Größe zu entfernen. Normalerweise sind diese Dateien 0 Bytes und da ich all diese Unterverzeichnisse zusammenführen möchte, könnte ich eine vollkommen legitime Datei durch eine schwerelose 0-Byte-Datei ersetzen, und schon ist meine legitime Datei fertig. Gibt es eine Möglichkeit, die Null-Byte-Dateien zu entfernen?

user245115
quelle

Antworten:

34

Verwenden Sie den Befehl Suchen , um Dateien nach Größe zu suchen und Dateinamen für die Standardausgabe auszudrucken.

find . -type f -size 0b -print

Ersetzen Sie -printdurch -delete, um die Dateien zu löschen, anstatt sie auf dem Bildschirm zu drucken.

find . -type f -size 0b -delete

quelle
Gibt es nun eine Möglichkeit, Dateien von einem Speicherort an einen anderen zu verschieben und bei Konflikten zu ersetzen, wenn die Größe identisch ist, aber beide Kopien beizubehalten, wenn die Größe unterschiedlich ist?
user245115
Das klingt nach einem Job für Rsync .
7
Sie können -emptyanstelle von verwenden -size 0b.
Kevin
6

Alle Dateien mit einer Größe von 0 rekursiv suchen und entfernen:

find . -type f -size 0 -print0 | xargs -I{} -0 rm {}

Beispiel:

% ls -og   
total 4
-rw-rw-r-- 1 0 Jun  7 20:31 bar
-rw-rw-r-- 1 5 Jun  7 20:29 foo

% find . -size 0 -print0 | xargs -I{} -0 rm {}

% ls -og                                      
total 4
-rw-rw-r-- 1 5 Jun  7 20:29 foo
AB
quelle
4

Sie können dies auch direkt in der Shell tun. Dies kann nützlich sein, wenn Sie keine leeren versteckten Dateien löschen möchten (diejenigen, deren Name mit einem beginnt .). Auch wenn Sie dies tun könnten, findwäre es eine Alternative, die Shell selbst zu verwenden:

shopt -s globstar
for file in **/*; do [ ! -s "$file" ] && [ -f "$file" ] && rm "$file"; done

Erläuterung

  • shopt -s globstar: aktiviert die Globstar-Option für Bash, mit der **eine oder mehrere Unterverzeichnisse abgeglichen werden . **/*stimmt mit allen Dateien und Verzeichnissen im aktuellen Verzeichnis und allen seinen Unterverzeichnissen überein.
  • for file in **/*; do ...; done : Alle gefundenen Dateien und Verzeichnisse durchlaufen;
  • [ ! -s "$file" ]: [ -s "$file" ]ist wahr, wenn die Datei existiert und nicht leer ist. Daher ist [ ! -s "$file" ](der !Test wird umgekehrt) wahr, wenn die Datei nicht existiert oder wenn sie leer ist.
  • [ -f "$file" ]: true, wenn die Datei eine reguläre Datei ist. Kein Verzeichnis, keine Gerätedatei, kein Symlink usw.
  • rm "$file" : Löschen Sie die Datei.

Stellen Sie &&sicher, dass der nächste Befehl nur ausgeführt wird, wenn der vorherige erfolgreich war, sodass nur leere, reguläre Dateien gelöscht werden.

terdon
quelle
und ich dachte, meine Antwort ist kompliziert :) +1
AB
2

Obwohl die meisten Antworten richtig sind, sollten Sie nach folgendem Befehl suchen:

Eine Datei mit einer Größe von 0 Byte bedeutet eine leere Datei

obwohl Sie diesen Befehl ausführen können:

find . -type f -empty -delete

Dadurch werden alle leeren Dateien gelöscht.

Sie können nach diesen Dateien suchen, bevor Sie sie löschen:

find . -type f -empty
Maythux
quelle
Auf Ubuntu 14.04 LTS, ohne die -type f, -emptyauch leere Verzeichnisse löschen. Ich habe gerade die Manpage durchgesehen.
Bulrush