¿es posible usar rm para eliminar archivos y directorios que coinciden con un patrón de forma recursiva sin usar otros comandos?
¿es posible usar rm para eliminar archivos y directorios que coinciden con un patrón de forma recursiva sin usar otros comandos?
Respuestas:
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
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 rm
Será mucho más robusto. Sin embargo, significará que no puede usar grep
y debe usar find
los 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
.
"sin usar otros comandos"
No.
Usando Bash, con globstar
set, sí :
rm basedir/**/my*pattern*
Pruébelo, por ejemplo ls -1
, primero, antes rm
de enumerar los archivos que coinciden.
Establece opciones a través de, por ejemplo shopt -s globstar
.
Alternativamente, una find
variante 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 rm
a rm -r
los comandos anteriores y omita la coincidencia solo -type f
en los find
comandos.
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.
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.