Dejé que un script de generación de datos se ejecute demasiado tiempo ahora tengo más de 200,000 archivos que necesito reducir a alrededor de 1000. Desde la línea de comandos de Linux, ¿hay una manera fácil de eliminar todos menos 1000 de estos archivos, donde los archivos que se retendrían no dependería del nombre del archivo ni de ningún otro atributo?
13

Respuestas:
Eliminar todos menos 1000 archivos aleatorios en un directorio
Código:
Explicación:
/path/to/dirconfind;print0: use\0( carácter nulo ) como delimitador de línea; para que las rutas de archivo que contienen espacios / líneas nuevas no rompan el guiónsort;-z: use\0(carácter nulo) como delimitador, en lugar de\n(una nueva línea)-R: Orden aleatoriotail;-z: trata la lista como delimitada por cero (igual que consort)-n +1001: muestra líneas que comienzan desde 1001 (es decir, omite las primeras 1000 líneas)xargs -0 rm- eliminar los archivos restantes;-0: delimitado por cero, de nuevoPor qué es mejor que la solución de quixotic *:
find.findno termine con\n(nueva línea) por alguna razón.* - crédito para quijotesca para
| sort -R | head -1000, me dio un punto de partida.fuente
find . -type f | sort -R | tail -n +1001 | xargs rmfind? Intentaré mejorar mi respuesta, solo necesito algo de información para trabajar.tail: invalid option -- 'z'la versión de tail que tengo es 8.4Utilice un directorio temporal, luego
findtodos sus archivos, aleatorice la lista consorty mueva los 1000 primeros de la lista al directorio temporal. Elimine el resto, luego mueva los archivos del directorio temporal.Si
xargsse queja de longitud de la línea, utilizar un número más pequeño conheady repetir el comando, según sea necesario (es decir, cambio-1000a-500y ejecutarlo dos veces, o el cambio a-200y ejecutarlo 5 veces).Tampoco podrá manejar nombres de archivos que incluyan espacios; Como muestra la respuesta de @ rld , puede usar
findel-print0argumento de, los-zargumentos desortyhead, y-0conxargspara garantizar el manejo adecuado del nombre de archivo.Finalmente, si
tmp-dirya existe, debe sustituir un nombre de directorio que no existe.fuente
findincluye un espacio.Para los usuarios de mac, el siguiente script debería hacer.
trpermitirá que sort y tail trabajen en listas con en\nlugar de\0.fuente
Lo más fácil podría ser rm -rf el directorio, luego volver a ejecutar el script de generación de datos y asegurarse de que no se ejecute durante demasiado tiempo.
fuente