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/dir
confind
;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
.find
no 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 rm
find
? 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
find
todos sus archivos, aleatorice la lista consort
y mueva los 1000 primeros de la lista al directorio temporal. Elimine el resto, luego mueva los archivos del directorio temporal.Si
xargs
se queja de longitud de la línea, utilizar un número más pequeño conhead
y repetir el comando, según sea necesario (es decir, cambio-1000
a-500
y ejecutarlo dos veces, o el cambio a-200
y ejecutarlo 5 veces).Tampoco podrá manejar nombres de archivos que incluyan espacios; Como muestra la respuesta de @ rld , puede usar
find
el-print0
argumento de, los-z
argumentos desort
yhead
, y-0
conxargs
para garantizar el manejo adecuado del nombre de archivo.Finalmente, si
tmp-dir
ya existe, debe sustituir un nombre de directorio que no existe.fuente
find
incluye un espacio.Para los usuarios de mac, el siguiente script debería hacer.
tr
permitirá que sort y tail trabajen en listas con en\n
lugar 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