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/dirconfind;<ú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
findno 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.