Eliminar todos menos 1000 archivos aleatorios en un directorio
Código:
find /path/to/dir -type f -print0 | sort -zR | tail -zn +1001 | xargs -0 rm
Explicación:
- Lista de todos los archivos en
/path/to/dir
confind
;<último> print0
:usa\0
(carácter nulo ) como delimitador de línea; por lo que las rutas de archivo que contienen espacios/nuevas líneas no rompen el script- Reorganizar la lista de archivos con
sort
;<último> -z
:usa\0
(carácter nulo) como delimitador, en lugar de\n
(una nueva línea)-R
:orden aleatorio- Elimine las primeras 1000 líneas de la lista aleatoria con
tail
;<último> -z
:trate la lista como delimitada por cero (igual que consort
)-n +1001
:mostrar líneas a partir de 1001 (es decir, omitir las primeras 1000 líneas)xargs -0 rm
- eliminar los archivos restantes;-0
:delimitado por cero, de nuevo
Por qué es mejor que la solución quijotesca*:
- Funciona con nombres de archivo que contienen espacios/nuevas líneas.
- No intenta crear ningún directorio (que puede que ya exista, por cierto)
- No mueve ningún archivo, ni siquiera toca los 1000 "archivos de la suerte" además de enumerarlos con
find
. - Evita perder un archivo en caso de que la salida de
find
no termina con\n
(nueva línea) por alguna razón.
* - crédito a quijotesco por | sort -R | head -1000
, me dio un punto de partida.