Löschen Sie Dateien eines bestimmten Größenbereichs

12

Ich möchte Dateien löschen, deren Größe zwischen bestimmten Werten liegt. Zum Beispiel habe ich die folgende Liste von Dateien:

-rw-r--r-- 1 smsc sys  558 Apr 30 13:07 stats.sfe.1.20120430130513.xml.Z
-rw-r--r-- 1 smsc sys  388 Apr 30 15:32 stats.sfe.1.20120430153013.xml.Z
-rw-r--r-- 1 smsc sys  386 Apr 30 15:36 stats.sfe.1.20120430153513.xml.Z
-rw-r--r-- 1 smsc sys  389 Apr 30 15:42 stats.sfe.1.20120430154013.xml.Z
-rw-r--r-- 1 smsc sys  390 Apr 30 16:02 stats.sfe.1.20120430160013.xml.Z
-rw-r--r-- 1 smsc sys  385 Apr 30 16:12 stats.sfe.1.20120430161013.xml.Z

Aus der obigen Liste möchte ich nur die Dateien löschen, deren Größe zwischen 386b und 390b variiert . Ich weiß, dass ich mit dem folgenden Befehl Dateien löschen kann, deren Größe bestimmte Werte überschreitet <size>:

find . -size +<size>-delete

Aber wie kann ich eine weitere Grenze für Dateien hinzufügen, deren Größe unter einem bestimmten Wert liegt?

Eugene S
quelle
4
findDie Bedingungen sind standardmäßig UND-verknüpft, setzen Sie also eine andere -sizeOption für die andere Grenze auf.
JW013
@ jw013 Großartig! Das ist für mich in Ordnung. Vielen Dank! Bitte poste es als deine Antwort und ich werde es akzeptieren.
Eugene S

Antworten:

7

Ein Bereich ist einfach eine Obergrenze UND eine Untergrenze. Aus der findSpezifikation :

Ausdruck [-a] Ausdruck

Konjunktion der Vorwahlen; Der Operator AND wird durch das Nebeneinander von zwei Primären impliziert oder vom optionalen Operator -a explizit angegeben. Der zweite Ausdruck wird nicht bewertet, wenn der erste Ausdruck falsch ist.

Sie müssen also lediglich beide Größengrenzen vor der -deleteAktion angeben .

jw013
quelle
8

Der -ain einem expliziten ANDOperator, mit dem Sie zwei Primaries verbinden können. In diesem Fall erstellen Sie einen Bereich mit -size.

find . -size +386b -a -size -390b -exec rm -f {} \;

Beachten Sie die Größe ein numerisches Argument ist , das optional mit vorangestellt werden kann +und -. Von man 1 find:

   Numeric arguments can be specified as

   +n     for greater than n,
   -n     for less than n,
    n      for exactly n.
George M
quelle
Vielen Dank für Ihre Antwort. Wie jedoch in @ jw013 in seinem Kommentar erwähnt, werden findBedingungen standardmäßig logisch UND verknüpft. Also habe ich noch eine sizeBedingung hinzugefügt und es hat gut funktioniert! Der letzte Befehl sieht aus wie:find . -maxdepth 1 -size +358c -size -395c -delete
Eugene S
7

Wann immer Sie findeine Zahl erwarten, können Sie ein +Zeichen voranstellen, um mehr als diese Zahl -zu bedeuten , oder ein Zeichen, um weniger als diese Zahl zu bedeuten. Dies sind strenge Ungleichungen: +3und -7bedeutet 4, 5 oder 6.

Beim -sizeprimären müssen Sie das Suffix hinzufügen, cum anzugeben, dass die Anzahl eine Anzahl von Bytes ist. Sie können mehrere Primaries verketten, um deren Konjunktion zu übernehmen (in einigen Versionen können Sie -aoder -andzwischen ihnen einfügen). Somit:

find . -size +385c -size -391c -delete

In zsh können Sie das L Glob-Qualifikationsmerkmal verwenden . Die Standardeinheit ist Bytes. wie finddie Zeichen +und -zeigen strenge Ungleichungen an.

rm *(L+385-391)

(Der obige Befehl wird nicht in Unterverzeichnisse zurückgeführt. Wenn Sie dies benötigen, fügen Sie ihn **/vor dem Muster hinzu.)

Gilles 'SO - hör auf böse zu sein'
quelle
Ich verstehe die Werte +3 und -7, die 4, 5 oder 6 entsprechen, nicht. Können Sie das erklären?
Hashim
1

Ein Weg mit perl:

perl -e '
    for ( @ARGV ) { 
        if ( -s >= 386 && -s _ <= 390 ) { 
            unlink $_ or printf qq[%s\n], qq[Could not delete $_: $!] 
        } 
    }
' *
Birei
quelle
Vielen Dank für Ihre Antwort! Sollte dieser Teil des Codes als einzelne Zeile eingegeben werden?
Eugene S
@EugeneS: Ja. Es sollte funktionieren, wenn Sie es unverändert in Ihre Befehlszeile einfügen oder alle Zeilen zu einer verbinden.
Birei