4 votos

Quitar todo pero los archivos del directorio de forma recursiva N

Me gustaría ir bajando una gran base de datos desde la línea de comandos a N de archivos, muy similar a esta pregunta. La única diferencia es que la mayoría de mis archivos están en sub-directorios, así que me preguntaba si había una forma rápida de resolver mi problema o si se requeriría más en profundidad de acción. Actualmente, mi comando (con la (N+1) reemplazado con el número que corresponda):

find . -type f | sort -R | tail -n +(N+1) | xargs rm

Originalmente se pensó que esto iba a funcionar, porque buscar por naturaleza es recursiva, y luego he intentado añadir el -r (recursivo de la flag) alrededor de la rm el resultado indica que es la selección aleatoria de los archivos, pero no puede encontrar a eliminar. Alguna idea?

EDIT: Mi nuevo comando se parece a esto:

find . -type f -print0 | sort -R | tail -n +(N+1) | xargs -0 rm

y ahora me sale el error que dice rm: missing operand. También, estoy en un CentOS máquina, de modo que el -z indicador no está disponible para mí.

EDICIÓN #2 Este comando ejecuta:

find . -type f -print0 | sort -R | tail -n +(N+1) | xargs -0 -r rm

pero cuando voy a ejecutar un find . -type f | wc -l para obtener el número de archivos en el directorio (que debe ser N si el comando funcionaba correctamente) no ha cambiado a partir de la cantidad de archivos.

1voto

Kamil Maciorowski Puntos 897

Si usted necesita usar find … -print0 y usted no puede usar -z con sort y/o tail, no es posible, sin embargo, engorroso solución (sustituto (N+1) como de costumbre):

find . -type f -printf "%i\n" | sort | uniq | sort -R | tail -n +(N+1) |
   while read i; do
      find . -type f -inum "$i" -delete
   done

El sucio truco es que el uso de números de inodo en lugar de rutas de acceso.

El interior de la find elimina todos los archivos con el número de inodo en el directorio actual, de modo que si algunos de los archivos son hardlinked uno a otro, entonces usted va a perder a todos ellos o mantenerlos a todos.

Preliminar sort | uniq es para evitar un percance cuando se pierde demasiado a causa de la duplicación de números de inodo porque de enlaces permanentes. Usted puede terminar para arriba con más de N nombres de archivo, señalando a N distintos de los inodos en total.

En caso de que su find no entiende -delete, uso -exec rm {} +.

0voto

Es verdad que el find sí es recursiva por defecto, de modo que no es necesario agregar un -r indicador rm. En lugar de eso, sospecho que el espacio en blanco para ser la causa del problema desde xargs hace uso de ambos espacios en blanco y saltos de línea como delimitadores de forma predeterminada.

Para hacer xargs trabajar mejor con find, el uso de la -0 opción para especificar el espacio nulo como el delimitador(permitir que los archivos con espacios en blanco y caracteres de nueva línea se procesan normalmente):

find . -type f | sort -R | tail -n +(N+1) | xargs -0 rm

Edit: también puede intentar añadir el -r comando xargs. Desde el error que ha recibido, parece que el comando rm se invoca sin nada para eliminar en un punto durante toda la ejecución. Así:

find . -type f -print0 | sort -R | tail -n +(N+1) | xargs -0 -r rm

Fuente

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: