Trova i file più vecchi di X giorni e salvali in base alle loro dimensioni


8

Sto cercando di ottenere i file più vecchi di un numero di giorni ed elencarli in ordine decrescente in base alla loro dimensione con tutte le loro informazioni (dimensione, percorso completo ecc. - qualcosa di simile fornito da ls).

Mentre sono in grado di individuare i file più vecchi con:

find . -mtime +10

Non sono in grado di elencare le informazioni desiderate.


aggiungi le informazioni sulla distro e sulla shell
lese

@lese: AIX 6.1; mentre echo $ SHELL -> / usr / bin / ksh
user148335

Sembra un XYProblem ... hai davvero bisogno di TUTTI i file per ordine di dimensione? o stai (più probabilmente) cercando file "vecchi" (> 10 giorni) abbastanza grandi e hai solo bisogno, diciamo, dei 200 più grandi per decidere quale di quelli che puoi eliminare per risparmiare spazio ?. In quest'ultimo caso, e dal momento che sei su AIX con forse senza strumenti gnu, una combinazione di find (output di tutti i file> 10 giorni) e awk (mantenendo i 200 file più grandi in un array, quindi eseguendo l'output in ordine) sarà il tuo scommessa migliore
Olivier Dulac il

Risposte:


8

A condizione che i percorsi dei file non contengano caratteri di nuova riga:

find . -mtime +10 -printf "%s %n %m %u %g %t %p" \( \
  -type l -printf ' -> %l\n' -o -printf '\n' \) | sort -k1,1 -n

Vedi findmanuale , sezione Actions.

  • %s Dimensione del file in byte.
  • %n Numero di collegamenti reali al file.
  • %m Bit di autorizzazione del file (in ottali ).
  • %u Nome utente del file o ID utente numerico se l'utente non ha un nome.
  • %g Nome del gruppo del file o ID numerico del gruppo se il gruppo non ha nome.
  • %t Ora dell'ultima modifica del file nel formato restituito dalla ctimefunzione C.
  • %p Nome del file.
  • %l Oggetto del collegamento simbolico (stringa vuota se il file non è un collegamento simbolico).

A proposito: si noti che il manuale POSIX find non specifica la maggior parte delle azioni precedenti.


1
Dice: find: 0652-017 -printf non è un'opzione valida.
user148335

per me funziona e sembra una soluzione abbastanza pulita +1
lese

@ user148335, non hai menzionato la distro Linux in esecuzione. Sembra che tu sia limitato alla specifica POSIX find , che è piuttosto limitata.
patryk.beza,

1
@ patryk.beza Immagino che stavi parlando con user148335
lese il

AIX 6.1; mentre echo $ SHELL -> / usr / bin / ksh
user148335

4

Questo comando utilizza solo le funzionalità POSIX di finde di ls:

find . -type f -mtime +10 -exec ls -lS {} +

Tuttavia, può chiamare lspiù di una volta, se nella directory corrente (o nelle sottodirectory ricorsivamente) è presente un numero molto elevato di file corrispondenti al -mtime +10primario.

Se chiama lspiù di una volta, ovviamente, l'ordinamento verrà eseguito solo all'interno di ogni lsesecuzione, non attraverso più esecuzioni.

Tuttavia, per un numero ragionevole di file, questa è probabilmente la soluzione migliore.


La versione aggiornata non si interrompe con spazi nel nome
Miguel G,

1
Se lsviene passato solo un argomento, c'è poco ordinamento che può fare su di esso. Con, +invece ;, sarebbe meglio, ma lspotrebbe comunque essere chiamato più volte se ci sono molti file.
Stéphane Chazelas,

2
Questo è il comando esatto che avrei dato, quindi ho aggiunto il testo esplicativo che avrei dato per seguirlo.
Carattere jolly

3

Con zsh:

ls -ldrS -- **/*(m+10)

O per evitare il doppio ordinamento (per nome per zsh e per dimensione per ls):

ls -ldrS -- **/*(m+10oN) # disable zsh sorting

o (se il tuo lssupporto -Uper non ordinati):

ls -ldU -- **/*(m+10oL) # disable ls sorting and have zsh sort by size

Aggiungi il Dqualificatore glob se vuoi vedere anche i file nascosti.


Funziona quando i nomi di utenti e gruppi contengono spazi?
roaima,

@roaima, sì. Perché non dovrebbe? Potrebbe rompersi per E2BIG, che puoi aggirare usando zargs.
Stéphane Chazelas,

Dal momento che l'hai fornito, sospettavo che sarebbe
andato tutto

1

Penso che potresti fare qualcosa di simile a:

find . -type f -mtime +10 -print0 | sort -n -r -k1 | while IFS= read -r -d $'\0' line; do
    #echo "$line"
    ls -lS "$line"    
done

notare il -Sparametro del lscomando:

-S ordina per dimensione del file


Dopo aver lasciato cadere -d $ '\ 0' a causa del messaggio: $ \ 0: questo non è un identificatore sono riuscito a ottenere l'output ma i file non vengono scritti in ordine decrescente in base alle loro dimensioni
user148335

Si interromperà quando si incontra una directory in /home/phphil. Provals -ld ...
roaima il

@Roaima, che ne dici di usare find . -type finvece?
lese

@lese Ho cambiato il codice ma il comando sembra lanciare due volte ogni file da ogni sottocartella. Ex.
user148335

find ... -type ffunzionerebbe, come aggiungerebbe la -dbandiera als
roaima il

1

prova questo:

find ./ -type f -mtime +10 -exec ls -ln {} \; | sort -r -k 5 -g

Con l'opzione -n, non è un problema perché non elenciamo username e groupname ma uid e gid invece
dervishe

0

Per una guida più semplice è possibile utilizzare l' findopzione -ls. Sembra che nella maggior parte dei casi la dimensione del file sia nella settima colonna delle informazioni elencate (quindi cambia 7alla fine del comando come appropriato in caso contrario):

find . -type f -mtime +10 -ls | sort -n -r -k7

0

Un'altra variante sarebbe quella di utilizzare:

  • trova (per trovare i file corrispondenti)
  • du (per mostrare la dimensione del file in KB)
  • ordina -n -r (per abbreviare in ordine decrescente)

Ecco il comando:

find . -type f -mtime +10 -exec du -k {} \; | sort -n -r
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.