Encuentre y elimine todos los directorios llamados "prueba" en Linux

35

Tengo muchos directorios llamados "prueba" y me gustaría eliminarlos.

Sé cómo encontrarlos e imprimirlos usando:

find . -name test -print

Ahora, ¿cómo hago para eliminar los directorios?


Tenga en cuenta que también tengo archivos en el directorio y que también deben eliminarse.

recolección de basura
fuente

Respuestas:

70

xargs hace toda la magia:

find . -name test -type d -print0|xargs -0 rm -r --

xargs ejecuta el comando pasado como parámetros, con los argumentos pasados ​​a stdin.

Esto se utiliza rm -rpara eliminar el directorio y todos sus elementos secundarios.

El --denota el final de los argumentos, para evitar una ruta que comienza con -de ser tratados como un argumento.

-print0le dice findque imprima \0caracteres en lugar de líneas nuevas; y -0le dice xargsque trate solo \0como separador de argumentos.

Esto está llamando rmcon muchos directorios a la vez, evitando la sobrecarga de llamar rmpor separado para cada directorio.


Como alternativa, findtambién puede ejecutar un comando para cada archivo seleccionado :

find . -name test -type d -exec rm -r {} \;

Y este, con mejor rendimiento, ya que llamará rmcon múltiples directorios a la vez :

find . -name test -type d -exec rm -r {} +

(Tenga +en cuenta el al final; este es equivalente a la xargssolución).

Arnaud Le Blanc
fuente
1
Excelente respuesta, especialmente +en el hallazgo. No tenía idea, definitivamente desearía haberlo sabido hace mucho tiempo.
Scott
cuidado con el último comando, de alguna manera eliminó algunos archivos. El xargscomando funcionó bien.
Henrique de Sousa
23
find /path/to/dir -name "test" -type d -delete
  • -name: busca el nombre pasado. Puede usar -regexpara proporcionar nombres basados ​​en expresiones regulares

  • -type: busca tipos de archivo. dsolo busca directorios

  • -delete: acción que elimina la lista encontrada.

Alternativamente:

find /path/to/dir -name "test" -type d -exec rm -rf {} \;

Como JF Sebastian declaró en los comentarios:

Puede usar en +lugar de \;pasar más de un directorio a la vez.

jaypal singh
fuente
1
Lo siento, olvidé mencionar que estos directorios pueden tener archivos. No pude eliminar algunos de ellos debido al error "buscar: no se puede eliminar` ./start ': el directorio no está vacío "
recolección de basura
@garbagecollection Agregué una actualización.
Jaypal Singh
3
podría usar en +lugar de \;pasar más de un directorio a la vez.
jfs
Gracias @JFSebastian Buen punto. Lo agregaré a la respuesta.
jaypal singh
5

También puede usar la opción -exec

find . -name test -exec rm {} \;
sethi
fuente
3

Asumiendo bash 4+

shopt -s globstar
rm -r ./**/test/

La barra diagonal final significa que solo coincidirá con los directorios. La prueba es de antemano con:

printf '%s\n' ./**/test/
maldad
fuente
2

Suponga que está usando gnu find , puede usar la opción -delete:

find . -name test -delete

que es más fácil de recordar

Chun Yang
fuente
2

Como señala otra respuesta, puede intentar encontrar todos los directorios con el nombre testy eliminarlos

find -name "test" -type d -delete

Me encontré con algunos problemas con la compatibilidad cruzada en Mac, así que usé este comando equivalente:

find -path "*/test" -type d -delete
  • -path : busca un patrón en el nombre de archivo completo.

Sin embargo, en cualquiera de los casos, si alguno de los directorios nombrados testtiene archivos, findse quejará de eso Directory is not emptyy no eliminará el directorio.

Si pretendía eliminar todos los archivos, incluido el testdirectorio, entonces podemos usar el mismo truco para eliminar todos los archivos dentro de los directorios nombrados testprimero.

find -path "*/test/*" -delete

El patrón: "*/test/*"garantizará que solo eliminemos archivos dentro de un directorio llamado /test/. Una vez que los directorios están vacíos, podemos continuar y eliminar los directorios con el primer comando:

find -path "*/test" -type d -delete

Ejemplo:

$ tree
.
├── mytest
│   └── test
│       └── blah.txt
├── test
│   ├── bar.jpg
│   └── dir
│       └── bar.bak
└── testdir
    └── baz.c

5 directories, 4 files

$ find -path "*/test" -type d -delete
$ tree
.
├── mytest
│   └── test
├── test
└── testdir
    └── baz.c

4 directories, 1 file

$ find -name "test" -type d -delete
$ tree
.
├── mytest
└── testdir
    └── baz.c

2 directories, 1 file
Karl
fuente