Elimina i file di un determinato intervallo di dimensioni


12

Voglio eliminare i file di dimensioni comprese tra determinati valori. Ad esempio ho il seguente elenco di file:

-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

Dall'elenco sopra, voglio eliminare solo i file le cui dimensioni variano tra 386b e 390b . So che posso usare il seguente comando per eliminare file le cui dimensioni superano determinate <size>:

find . -size +<size>-delete

Ma come posso aggiungere un ulteriore limite per i file di dimensioni inferiori a un determinato valore?


4
findle condizioni sono logicamente AND per impostazione predefinita, quindi basta -sizescegliere un'altra opzione per l'altro limite.
jw013,

@ jw013 Ottimo! Per me va bene. Grazie! Si prega di pubblicarlo come risposta e lo accetterò.
Eugene S

Risposte:


7

Un intervallo è semplicemente un limite superiore E un limite inferiore. Dalle findspecifiche :

espressione [-a] espressione

Congiunzione di primarie; l'operatore AND è implicito dalla giustapposizione di due primarie o reso esplicito dall'operatore -a opzionale. La seconda espressione non deve essere valutata se la prima espressione è falsa.

Quindi tutto ciò che devi fare è specificare entrambi i limiti di dimensione prima -deletedell'azione.


8

L' operatore -aesplicito ANDche ti consente di congiungere due primarie. In questo caso creando un intervallo usando -size.

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

Si noti che la dimensione è un argomento numerico che può essere facoltativamente anteposto a +e -. Da man 1 find:

   Numeric arguments can be specified as

   +n     for greater than n,
   -n     for less than n,
    n      for exactly n.

La ringrazio per la risposta. Tuttavia, come menzionato da @ jw013 nel suo commento, le findcondizioni sono logicamente AND impostate di default. Quindi ho appena aggiunto un'altra sizecondizione e ha funzionato bene! Il comando finale è simile a:find . -maxdepth 1 -size +358c -size -395c -delete
Eugene S

7

Ogni volta che si findaspetta un numero, è possibile mettere un +segno prima che significhi più di questo numero o un -segno significhi meno di questo numero. Queste sono disuguaglianze rigorose: +3e -7significa 4, 5 o 6.

Con il -sizeprimario, è necessario aggiungere il suffisso cper indicare che il numero è un numero di byte. Puoi concatenare più primarie per prendere la loro congiunzione (in alcune versioni, puoi mettere -ao -andtra di loro). Così:

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

In zsh, è possibile utilizzare il L qualificatore glob . L'unità predefinita è byte; come findi personaggi +e -indicano rigide disuguaglianze.

rm *(L+385-391)

(Il comando sopra non ricorre nelle sottodirectory; se ne hai bisogno, aggiungi **/prima del modello.)


Non capisco i +3 e -7 equivalenti a 4, 5 o 6. Potresti spiegare?
Hashim,

1

Un modo usando perl:

perl -e '
    for ( @ARGV ) { 
        if ( -s >= 386 && -s _ <= 390 ) { 
            unlink $_ or printf qq[%s\n], qq[Could not delete $_: $!] 
        } 
    }
' *

La ringrazio per la risposta! Questa parte del codice deve essere inserita come una riga singola?
Eugene S

@EugeneS: Sì. Dovrebbe funzionare incollandolo nella riga di comando così com'è o unendo tutte le linee in una.
Birei,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.