Entfernen Sie rekursiv Dateien mit einer Größe von weniger als 1 MB


Antworten:


21

Dies kann erfolgen mit find:

find . -type f -size -1M -exec rm {} +

Beachten Sie, dass dies rekursiv in Unterverzeichnisse abfällt und bedingungslos alle Dateien löscht, die kleiner als 1 Megabyte sind. Achtung.


Sie vermissen das Pfadargument zufind

@Useless: Das ist GNU find. :)
Sven Marnach

2
@DanielAndersson: findBeschränkt die Anzahl der Argumente auf den aufgerufenen Prozess, damit sie in die Systemgrenzen passen, im Gegensatz rm *zu einem einzelnen Prozessaufruf. findwird rmbei Bedarf mehrere Instanzen von aufrufen . Und ich bin mir ziemlich sicher, dass Sonderzeichen, einschließlich Zeilenvorschubzeichen, korrekt behandelt werden. Ich ziehe es -exec rmüber -deleteaus Gründen der Flexibilität - als Beispiel, wobei die letzteren bietet keine Möglichkeit , zu löschen schreibgeschützte Dateien.
Sven Marnach

1
@Invoker: Ich habe Ihre Änderung zurückgesetzt, da sie nicht korrekt war. -1Mbedeutet weniger als ein Megabyte nach Wunsch. Ihre Version würde alle Dateien mit einer Größe von genau einem Megabyte löschen, was eine etwas sinnlose Operation zu sein scheint.
Sven Marnach

2
Wenn Sie alle Dateien entfernen möchten, die größer als 1 MB sind, verwenden Sie den Befehl find . -type f -size +1M -exec rm {} +. Beachten Sie die + 1M anstelle von -1M.
Chessofnerd

10

Dies sollte den Job machen:

$ find <directory> -type f -size -1M -delete

Ich glaube nicht, dass wir einen Bindestrich von 1 Million eingeben müssen.
Invoker

2
@ Invoker, ich glaube, das -Zeichen ist ein Minuszeichen und bedeutet "weniger als 1M". Wenn Sie ausführen find <directory> -type f -size +1M -delete, werden alle Dateien gelöscht, die größer als 1 MB sind.
Chessofnerd

Ja, Sie haben Recht, mein schlechtes
Invoker

2

Nur für Abwechslung und einen möglichen (wahrscheinlich marginalen) Leistungszuwachs:

find <directory> -type f -size -1M -print0  | xargs -0 rm

Wie soll das schneller sein? Es startet ein zusätzlicher xargsProzess.
Sven Marnach

Jetzt können zwei CPUs um dasselbe Blockgerät kämpfen! Sinnvollerweise werden die stat / readdir-Operationen nicht synchron durch die Unlink-Operation blockiert. Ob dies wahrscheinlich besser sein wird, hängt natürlich von der Größe des Teilbaums, der Anzahl der Dateien, dem Gerät usw. ab.

1

Versuchen

finden . -size -1M -exec rm {} \;


1
Dies ist großartig für Nicht-GNU-Benutzer. Vielen Dank! das gleiche wie \;+
@svens

-1

Sie können diesen Link http://ayaz.wordpress.com/2008/02/05/bash-quickly-deleting-empty-files-in-a-directory/ auschecken , es hat genau das, was Sie wollen.

for file in *;
  do
    file_size=$(du $file | awk '{print $1}');
    if [ $file_size == 0 ]; then
        echo "Deleting empty file $file with file size $file_size!";
        echo "rm -f $file";
    fi;
done

Sie können alle Dateien mit einer for-Schleife durchlaufen und dann mit du und awk die Dateigröße wie im obigen Beispiel ermitteln.


Antworten auf SO sollten in sich geschlossen sein - posten Sie keinen bloßen Link. (Außerdem löscht der Code in dem verknüpften Beitrag leere Dateien anstelle von Dateien, die kleiner als 1 MB sind.)
Sven Marnach

@SvenMarnach können wir in dem angegebenen Codebeispiel-Link nicht $ file_size <1M verwenden.

Nein, das können wir nicht, da die Shell es nicht versteht 1M.
Sven Marnach

Mit 1M meinte ich 1048576 1MB in Byte konvertieren

1
Wenn Sie testen, ob dies wirklich funktioniert, und den Code in Ihre Antwort kopieren, wird dies möglicherweise zu einer SO-Antwort.
Sven Marnach
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.