2012-12-15 12 views
6

Ho bisogno di scrivere uno script che annota tutti i file nel catalogo selezionato, che sono più grandi di alcune dimensioni. Inoltre ho bisogno di ordinarli per dimensione, nome e data dell'ultima modifica.Come trovare i file più grandi di una certa dimensione e ordinarli in base alla data dell'ultima modifica?

Così ho fatto i primi due casi:

Ordina per dimensioni

RESULTS=`find $CATALOG -size +$SIZE | sort -n -r | sed 's_.*/__'` 

Ordina per nome

RESULTS=`find $CATALOG -size +$SIZE | sed 's_.*/__' | sort -n ` 

ma non ho idea di come ordinare i risultati entro la data dell'ultima modifica.

Qualsiasi aiuto sarebbe apprezzato.

+0

Vedi anche [Come posso trovare i file che sono più grandi/più piccolo di x byte?] (Http://superuser.com/q/204564/173513) su Super Utente. – jww

+0

In realtà ho trovato una risposta a una domanda che stavo per porre in questa stessa domanda (trovare file di una certa dimensione) - grazie :-) – markc

risposta

11

Uno degli approcci migliori, purché non si abbiano troppi file, è quello di utilizzare ls per eseguire l'ordinamento stesso.

Ordina per nome e stampare un file per ogni riga:

find $CATALOG -size +$SIZE -exec ls -1 {} + 

Ordina per dimensioni e stampare un file per riga:

find $CATALOG -size +$SIZE -exec ls -S1 {} + 

Ordina per data di modifica e stampare un file per riga:

find $CATALOG -size +$SIZE -exec ls -t1 {} + 

È anche possibile giocare con gli interruttori ls: Ordina per ora di modifica (prima piccola) w esimo lungo messa in vendita di formato, con i formati leggibili:

find $CATALOG -size +$SIZE -exec ls -hlrt {} + 

Oh, si potrebbe desiderare di solo find i file (e ignorare le directory):

find $CATALOG -size +$SIZE -type f -exec ls -hlrt {} + 

Infine, alcune considerazioni: Evitare variabile capitalizzati i nomi in bash (è considerato una cattiva pratica) ed evitano i tick posteriori, usare invece $(...). Ad esempio,

results=$(find "$catalog" -size +$size -type f -exec ls -1rt {} +) 

Inoltre, probabilmente non si desidera mettere tutti i risultati in una stringa come nella riga precedente. Probabilmente vuoi mettere i risultati in un array.In tal caso, utilizzare mapfile come questo:

mapfile -t results < <(find "$catalog" -size +$size -type f -exec ls -1rt {} +) 
+0

Grazie, risposta molto utile ed esauriente. –

+1

Mi chiedo sempre come potrebbe essere bello se si potesse usare il comando locate invece di find. Come regola generale, funziona molto più velocemente del ritrovamento. Sfortunatamente non ha l'opzione "-exec" ( – Tebe

1

Prova xargs (fare qualsiasi cosa, trattando STDIN come un elenco di argomenti) e le -t e -r bandiere a ls. vale a dire qualcosa di simile:

find $CATALOG -size +$SIZE | xargs ls -ltr 

che vi darà i file ordinati per data di ultima modifica.

L'ordinamento in base a più attributi contemporaneamente sarà davvero difficile da fare con le utilità e le pipe della shell - Penso che dovrai usare un linguaggio di scripting (ruby, perl, php, qualunque), a meno che il tuo shell non sia è forte.

Problemi correlati