Come faccio a eliminare tutti i file più recenti di 10 in Linux?

Sto cercando di mantenere una directory piena di file di registro gestibile. Notturno, voglio eliminare tutti i 10 più recenti. Come posso fare questo in un singolo command?

Per una soluzione porttile e affidabile, prova questo:

ls -1tr | head -n -10 | xargs -d '\n' rm -f -- 

La syntax tail -n -10 in una delle altre risposte non sembra funzionare ovunque (ad esempio, non sui miei sisthemes RHEL5).

E usando $() o `` sulla row di command di rm corre il rischio di

  1. dividere i nomi di file con spazio bianco e
  2. superando il limite massimo di caratteri della row di command.

xargs corregge entrambi questi problemi perché automaticamente capire quanti argomenti possono passare entro il limite dei caratteri e con il -d '\n' dividerà solo al limite di linea dell'ingresso. Tecnicamente ciò può ancora causare problemi per i nomi di file con una nuova row in essi, ma è molto less comune dei nomi di file con spazi, e l'unico modo per le linee nuove sarebbe molto più complicato, probabilmente coinvolgendo alless awk, se non perl.

Se non si dispone di xargs (vecchi sisthemes AIX, forse?) Si potrebbe fare un ciclo:

 ls -1tr | head -n -10 | while IFS= read -rf; do rm -f "$f" done 

Questo sarà un po 'più lento perché genera un rm separato per each file, ma continuerà a evitare le caveat 1 e 2 sopra (ma ancora soffre di nuove righe nei nomi di file).

Il codice che desideri includere nello script è

  rm -f $(ls -1t /path/to/your/logs/ | tail -n +11) 

L'opzione -1 (numbersca) printing each file su una singola row per essere sicuro. L'opzione -f a rm dice di ignorare i file inesistenti per quando ls non restituisce nulla.

Uno strumento come logrotate lo fa per te. Rende molto più facile la gestione del log. Puoi anche includere routine di pulizia aggiuntive come l'aureola suggerita.

Apparentemente parsing ls è male .

Se each file viene creato giornalmente e si desidera mantenere i file creati negli ultimi 10 giorni è ansible:

 find /path/to/files -mtime 10 -delete 

Oppure, se each file viene creato in modo arbitrario:

 find /path/to/files -maxdepth 1 -type f -printf '%Ts\t%P\n' | sort -n | head -n -10 | cut -f 2- | xargs rm -rf 

Ho modificato un po ' l'approccio di Isaac .

Ora funziona con un path desiderato:

 ls -d -1tr /path/to/folder/* | head -n -10 | xargs -d '\n' rm -f 

Da qui :

 #! /bin/sh # keepnewest # # Simple directory trimming tool to handle housekeeping # Scans a directory and deletes all but the N newest files # # Usage: cleanup <dir> <number of files to keep> # # v 1.0 Piers Goodhew 1/mar/2007. No rights retained. if [ $# -ne 2 ]; then echo 1>&2 "Usage: $0 <dir> <number of files to keep>" exit 1 fi cd $1 files_in_dir=`ls | wc -l` files_to_delete=`expr $files_in_dir - $2` if [ $files_to_delete -gt 0 ]; then ls -t | tail -n $files_to_delete | xargs rm if [ $? -ne 0 ]; then echo "An error ocurred deleting the files" exit 1 else echo "$files_to_delete file(s) deleted." fi else echo "nothing to delete!" fi 

In Bash puoi provare:

 ls -1t | (i=0; while read f; do if [ $i -lt 10 ]; then ((i++)) continue else rm -f "$f" fi done) 

Questo salta i 10 nuovi als elimina il resto. logrotate può essere migliore, voglio solo correggere le risposte sbagliate relative alle shell.

non sicuro che questo aiuterà chiunque ma per evitare potenziali problemi con personaggi non vincenti ho usato solo ls per eseguire il tipo ma poi utilizzare i file inode per l'eliminazione.

Per la directory corrente, questo mantiene i 10 file più recenti in base al tempo di modifica.

ls -1tri | awk '{print $1}' | head -n -10 | xargs -n1 -t -Iinode find . -inum inode -exec rm -i {} \;