Elimina tutti i file casuali tranne 1000 in una directory
Codice:
find /path/to/dir -type f -print0 | sort -zR | tail -zn +1001 | xargs -0 rm
Spiegazione:
- Elenca tutti i file in
/path/to/dir
confind
;print0
:usa\0
(carattere nullo ) come delimitatore di riga; quindi i percorsi di file contenenti spazi/newline non interrompono lo script
- Mescola l'elenco dei file con
sort
;-z
:usa\0
(carattere nullo) come delimitatore, invece di\n
(una nuova riga)-R
:ordine casuale
- Elimina le prime 1000 righe dall'elenco casuale con
tail
;-z
:tratta l'elenco come delimitato da zero (come consort
)-n +1001
:mostra le righe che iniziano da 1001 (ovvero ometti le prime 1000 righe)
xargs -0 rm
- rimuovere i file rimanenti;-0
:delimitato da zero, di nuovo
Perché è meglio della soluzione donchisciottesca*:
- Funziona con nomi di file contenenti spazi/newline.
- Non tenta di creare alcuna directory (che potrebbe già esistere, tra l'altro)
- Non sposta alcun file, non tocca nemmeno i 1000 "file fortunati" oltre a elencarli con
find
. - Evita di perdere un file nel caso in cui l'output di
find
non termina con\n
(nuova riga) per qualche motivo.
* - credito a donchisciottesco per | sort -R | head -1000
, mi ha dato un punto di partenza.