Rimuovere in modo ricorsivo i file con dimensioni inferiori a 1 MB


Risposte:


21

Questo può essere fatto con find:

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

Si noti che questo ricadrà ricorsivamente nelle sottodirectory e eliminerà incondizionatamente tutti i file di dimensioni inferiori a 1 megabyte. Stai attento.


ti stai perdendo l'argomento path tofind

@Useless: Questo è GNU find. :)
Sven Marnach,

2
@DanielAndersson: findlimita il numero di argomenti al processo chiamato per adattarsi ai limiti del sistema, al contrario rm *, che è garantito come una singola chiamata di processo . findinvocherà più istanze di rmse necessario. E sono abbastanza sicuro che i caratteri speciali siano trattati correttamente, inclusi i caratteri di nuova riga. Preferisco -exec rmoltre -deleteper motivi di flessibilità: ad esempio, quest'ultimo non offre alcun modo per eliminare i file protetti da scrittura.
Sven Marnach,

1
@Invoker: ho ripristinato la modifica poiché non era corretta. -1Msignifica meno di un megabyte come desiderato. La tua versione eliminerebbe tutti i file con esattamente un megabyte di dimensioni, il che sembra un'operazione alquanto inutile.
Sven Marnach,

2
Per chiunque sia interessato, se si desidera rimuovere tutti i file superiori a 1 M, utilizzare il comando find . -type f -size +1M -exec rm {} +. Nota + 1M invece di -1M.
chessofnerd,

10

Questo dovrebbe fare il lavoro:

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

Non penso che dobbiamo uscire dal trattino da 1M.
Invocatore

2
@Invoker, credo che il -segno sia un segno meno che significa "meno di 1 m". Se esegui find <directory> -type f -size +1M -delete, eliminerai tutti i file più grandi di 1 milione.
chessofnerd,

Sì, hai ragione, cattivo
Invocatore,

2

Solo per varietà e un possibile (probabilmente marginale) aumento delle prestazioni:

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

Come dovrebbe essere più veloce? Avvia un ulteriore xargsprocesso.
Sven Marnach,

Ora puoi avere due CPU in competizione per lo stesso dispositivo a blocchi! Più sensatamente, le operazioni stat / readdir non sono bloccate in modo sincrono dall'operazione di scollegamento. La probabilità che ciò vada meglio dipende ovviamente dalle dimensioni della sottostruttura, dal numero di file, dal dispositivo ecc.

1

Provare

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


1
Questo è ottimo per gli utenti non GNU. Grazie! lo stesso della risposta di @ Sven, ma con \;alla fine invece di+
hamx0r

-1

Puoi controllare questo link http://ayaz.wordpress.com/2008/02/05/bash-quickly-deleting-empty-files-in-a-directory/ , ha esattamente quello che vuoi.

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

È possibile scorrere tutti i file con un ciclo for e quindi usare du e awk per trovare le dimensioni del file come nell'esempio sopra.


Le risposte su SO dovrebbero essere autosufficienti - non pubblicare un semplice link. (Inoltre, il codice nel post collegato elimina i file vuoti anziché i file più piccoli di 1 milione.)
Sven Marnach

@SvenMarnach non possiamo usare $ file_size <1M nel link di esempio del codice dato.

No, non possiamo, poiché la shell non capirà 1M.
Sven Marnach,

Per 1M intendevo 1048576 convertendo 1 MB in byte

1
Bene, se si verifica se funziona davvero e si copia il codice nella risposta, questa potrebbe diventare una risposta SO.
Sven Marnach,
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.