Elimina i file più vecchi di quelli specifici


14

Devo eliminare da una cartella tutti i file più vecchi di un file specifico.
Esecuzione di bash su CentOS 7.

Ho una soluzione per questo, ma penso che ci dovrebbe essere un modo più elegante per farlo:

reference_file=/my/reference/file

get_modify_time()
{
    stat $1 | grep -Po "Modify: \K[0-9- :]*"
}

pit=$(get_modify_time $reference_file)
for f in /folder/0000* ; do [[ "$pit" > "$(get_modify_time $f)" ]] && rm $f ; done

Risposte:


28

Non l'ho provato, ma finddovrei essere in grado di gestire l'intera operazione bene:

$ find dir/ -type f ! -newer reference -delete

... o...

$ find dir/ -type f ! -newer reference ! -name reference -delete

Fondamentalmente:

  • ! -newer referencecorrisponde ai file che sono stati modificati meno di recente reference.
  • -delete li elimina.
  • ! -name referenceesclude reference, nel caso si trovi anche sotto dir/e desideri mantenerlo.

Questo dovrebbe eliminare tutti i file più vecchi di referencee situati sotto dir/.


2
Perfetto :). Appena aggiunto -maxdepth 1per mantenere la ricerca non ricorsiva
csny

3
! -newersignifica "non più nuovo", quindi "più vecchio o della stessa età "; il file stesso verrà abbinato se si trova nel percorso find, solo qualcosa da tenere a mente.
ferada,

1
@ferada Non lo escluderai, motivo per cui la mia risposta include anche ! -name reference(vedi il terzo punto).
John WH Smith,

7

confrontare i tempi di modifica dei file con test, utilizzando gli operatori -nt(più recenti di) e -ot(più vecchi di):

if [ "$file1" -ot "$file2" ]; then
    #do whatever you want;
fi

2
Grazie, è meglio della mia soluzione ma devi ancora iterare tutti i file nella cartella e confrontarli ... L'altra risposta è ancora più elegante
csny
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.