@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.
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.
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.
Antworten:
Dies kann erfolgen mit
find
:Beachten Sie, dass dies rekursiv in Unterverzeichnisse abfällt und bedingungslos alle Dateien löscht, die kleiner als 1 Megabyte sind. Achtung.
quelle
find
find
. :)find
Beschränkt die Anzahl der Argumente auf den aufgerufenen Prozess, damit sie in die Systemgrenzen passen, im Gegensatzrm *
zu einem einzelnen Prozessaufruf.find
wirdrm
bei 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-delete
aus Gründen der Flexibilität - als Beispiel, wobei die letzteren bietet keine Möglichkeit , zu löschen schreibgeschützte Dateien.-1M
bedeutet 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.find . -type f -size +1M -exec rm {} +
. Beachten Sie die + 1M anstelle von -1M.Dies sollte den Job machen:
quelle
-
Zeichen ist ein Minuszeichen und bedeutet "weniger als 1M". Wenn Sie ausführenfind <directory> -type f -size +1M -delete
, werden alle Dateien gelöscht, die größer als 1 MB sind.Nur für Abwechslung und einen möglichen (wahrscheinlich marginalen) Leistungszuwachs:
quelle
xargs
Prozess.Versuchen
quelle
\;
+
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.
Sie können alle Dateien mit einer for-Schleife durchlaufen und dann mit du und awk die Dateigröße wie im obigen Beispiel ermitteln.
quelle
1M
.