use rm para eliminar archivos y directorios de forma recursiva

17

¿es posible usar rm para eliminar archivos y directorios que coinciden con un patrón de forma recursiva sin usar otros comandos?

usuario15586
fuente

Respuestas:

35

Para responder directamente a su pregunta, "no, no puede hacer lo que describe con rm".

Usted puede , sin embargo, hacerlo lo combinas con find. Aquí hay una de las muchas maneras en que podría hacer eso:

 # search for everything in this tree, search for the file pattern, pipe to rm
 find . | grep <pattern> | xargs rm

Por ejemplo, si desea destruir todos los archivos * ~, puede hacerlo así:

 # the $ anchors the grep search to the last character on the line
 find . -type f | grep '~'$ | xargs rm

Para ampliar desde un comentario * :

 # this will handle spaces of funky characters in file names
 find -type f -name '*~' -print0 | xargs -0 rm
madriguera
fuente
1
Es cierto: si deja de lado la última pipa, obtendrá una lista de todo lo primero :)
Warren
2
Puede que no responda directamente a la pregunta del póster, pero es lo más cerca que estarán de lo que quieren.
Drakia
1
Un enano, ¿no es eso un poco amargo sin razón?
Gnoupi
10
Tenga mucho cuidado al usar find | grep | xargs rm. Si hay archivos con espacios (o líneas nuevas), esto se romperá (y dependiendo de los nombres de los archivos y de dónde están los espacios) podría eliminar cosas que no tenía la intención de eliminar. find … -print0 | xargs -0 rmSerá mucho más robusto. Sin embargo, significará que no puede usar grepy debe usar findlos predicados para hacer coincidir e imprimir0 solo los archivos deseados. El segundo ejemplo de Warren será más robusto como find -type f -name '*~' -print0 | xargs -0 rm.
Chris Johnsen
1
Si desea que un solo comando haga el trabajo, cree un alias con uno de los comandos de búsqueda dados. Completará una respuesta para esto más adelante, si lo desea.
casualuser
8

"sin usar otros comandos"

No.

Drakia
fuente
Buena respuesta que ilustra el "responder estrictamente la pregunta inicial (a riesgo de no poder proporcionar una solución)" vs. "proporcionar una solución, incluso si no coincide estrictamente con el debate de las restricciones impuestas".
Gnoupi
Solo publiqué esto porque "A Dwarf" se quejaba de la respuesta que realmente proporcionaba una solución. Sin usar otros comandos, realmente no hay forma de hacer una eliminación recursiva de archivos que coincida con un patrón, solo la eliminación del archivo / directorio del directorio actual.
Drakia
3

Usando Bash, con globstarset, :

rm basedir/**/my*pattern*

Pruébelo, por ejemplo ls -1, primero, antes rmde enumerar los archivos que coinciden.

Establece opciones a través de, por ejemplo shopt -s globstar.


Alternativamente, una findvariante más corta :

find -type f -name 'my*pattern*' -delete

o para GNU find:

find -type f -name 'my*pattern*' -exec rm {} +

u otra alternativa para no GNU find(un poco más lento):

find -type f -name 'my*pattern*' -exec rm {} \;

Para eliminar también los directorios, a medida que lo solicite: simplemente cambie rma rm -rlos comandos anteriores y omita la coincidencia solo -type fen los findcomandos.

Daniel Andersson
fuente
0

Hubiera supuesto "rm -rf", ¿dónde hay una combinación de nombres de archivo y patrones coincidentes como * y? etc (por ejemplo, hoy_log_2009 ????. log). Eso comenzará a partir del Dir actual y disminuirá de forma recursiva la eliminación de archivos que tengan ese patrón.

ianfuture
fuente
Esto no funcionará porque el patrón se expande por el shell en el directorio actual. Si se cita, el patrón se convierte en un nombre de archivo con caracteres especiales. por ejemplo, para eliminar el archivo [, se podría escribir rm '['. El patrón simplemente pierde su significado.
casualuser
0

Si usa zsh (1) , active "globbing extendido" con setopt extendedglob.zshrc. Prefijar el patrón con '** /' luego eliminará recursivamente:

% rm -rf ** / <patrón>

Sin embargo, si hay muchos archivos para eliminar, debe recurrir a find (1) con xargs (1) o -exec, y también recomiendo hacerlo en scripts de shell.

kaleissin
fuente