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/dirconfind;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
findnon termina con\n(nuova riga) per qualche motivo.
* - credito a donchisciottesco per | sort -R | head -1000 , mi ha dato un punto di partenza.