GNU/Linux >> Linux Esercitazione >  >> Linux

Come faccio a trovare i file e sommare le loro dimensioni?

Soluzione

Fornendo l'opzione -c (o --total ) a du(1) , puoi istruirlo a produrre un totale generale. Se la tua implementazione di du(1) supporta una di queste opzioni, puoi ottenere l'effetto desiderato usando il seguente comando:

$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +

MODIFICA: Nota che se il numero di file supera il numero massimo di parametri consentiti dal tuo sistema, find può ancora eseguire command più volte. Alcune implementazioni di du(1) supporta anche la lettura dei nomi dei file da un file, che non soffre della suddetta limitazione:

$ find -name 'flibble*' -ctime +90 -print0 > filenames
$ du -shc --files0-from=filenames

Spiegazione

La differenza tra la semantica di -exec command {} \; e -exec command {} + è il seguente:

  • command {} \; esegue command una volta per ogni risultato di find . Viene passato il percorso del risultato invece di {} .

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} \;
    1
    2
    3
    
  • command {} + esegue command , quando tutti i risultati sono stati recuperati. I percorsi dei risultati vengono passati invece di {} .

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} +
    1 2 3
    

Il -print0 opzione provoca find(1) per stampare i nomi dei file trovati sullo standard output separati dal carattere null e dal --files0-from opzione ha causato du(1) per leggere i nomi di file separati da null. A differenza del carattere di nuova riga, il carattere null potrebbe non apparire in un nome file, quindi l'output non è ambiguo.

Per ulteriori informazioni sulle opzioni di du(1) e find(1) , dovresti consultare le rispettive manpage:

$ man du
$ man find

Prova questo:

du -c `find . -name 'flibble*' -ctime +90` | tail -1

Il comando originale fornisce du un argomento, quindi lo esegue, finché non passa attraverso tutti gli argomenti. In questo modo, gli stai semplicemente dando tutti gli argomenti in una volta, quindi tagliando le dimensioni separate e lasciando solo il totale. Puoi rimuovere il tubo e la coda per mostrare la dimensione di ciascun file, se lo desideri.


Puoi provare questo:

find . -name 'flibble*' -ctime +90 -exec du -ch {} + | grep total

Linux
  1. Come trovare file con autorizzazioni SUID e SGID in Linux

  2. Come cercare i file per dimensione ed estensione?

  3. Utilizzo di ls per elencare le directory e le loro dimensioni totali

  4. Trova e copia i file

  5. Come eseguire il chmod e il chown dei file nascosti in Linux?

Come trovare ed elencare in modo ricorsivo i file per data in Linux

Come trovare ed eliminare file duplicati in Linux

Come trovare ed eliminare file che contengono un testo specifico nei loro nomi in Linux

Come trovare file in base alle loro autorizzazioni in Linux

Come trovare file duplicati in Linux e rimuoverli

Come trovare file in Debian