En Linux, ¿cómo elimino carpetas con un nombre determinado que están anidadas en una jerarquía de carpetas?
Las siguientes rutas están debajo de una carpeta y me gustaría eliminar todas las carpetas nombradas a
.
1/2/3/a
1/2/3/b
10/20/30/a
10/20/30/b
100/200/300/a
100/200/300/b
¿Qué comando de Linux debo usar de la carpeta principal?
Respuestas:
Si el directorio de destino está vacío, use find, filtre solo con directorios, filtre por nombre, ejecute rmdir:
Si desea eliminar recursivamente su contenido, reemplácelo
-exec rmdir {} \;
por-delete
o-prune -exec rm -rf {} \;
. Otras respuestas incluyen detalles sobre estas versiones, acéptelas también.fuente
{} \;
hace?{}
puede leerse como "para cada archivo / carpeta coincidente", es decir, sustituye a cada archivo / carpeta "encontrado".\;
es un terminador para la-exec
cláusula-prune
indicador a la respuesta según la sugerencia de @David Grayson. Sin esto,find
aún intentará visitar la carpeta que ahora falta y finalmente saldrá con un código de error, que puede, por ejemplo, fallar en una compilación de Docker.Use find para el nombre "a" y ejecute rm para eliminar aquellos nombrados de acuerdo a sus deseos, de la siguiente manera:
Pruébelo primero usando ls para enumerar:
Para asegurarse de que esto solo elimine directorios y no archivos sin formato, utilice el argumento "-type d" (como se sugiere en los comentarios):
El "{}" es una sustitución para cada archivo "a" encontrado: el comando exec se ejecuta contra cada uno por sustitución.
fuente
1/2/a/3/4
, que puede no ser intencionado, por lo que +1 para la recomendación de probar primero ...echo {}
para probarlo primero, en lugar dels {}
node_modules/
.find . -name a -type d -exec rm -rf {} \;
y funcionó, aunque se imprimiófind: ‘./subdir/subdir/a’: No such file or directory
para cada directorio eliminado.Esto también funciona: eliminará todas las carpetas llamadas "a" y sus contenidos:
fuente
find/rm
.find . -name a -exec rm -rf {} \;
, find se bloqueará cuando intente ingresar a ese directorio para buscar más elementos, dándole un error comofind: '1/2/3/a': No such file or directory
.illegal option --t
. Tuve que pasar también el directorio para buscar en ( stackoverflow.com/questions/25840713/... ):rm -rf `find . -type d -name a`
.Para eliminar todos los directorios con el nombre
foo
, ejecute:A las otras respuestas les falta algo importante: la
-prune
opción. Sin-prune
, GNU find eliminará el directorio con el nombre correspondiente y luego intentará recurrir a él para encontrar más directorios que coincidan. La-prune
opción le dice que no vuelva a aparecer en un directorio que coincida con las condiciones.fuente
Terminé aquí buscando eliminar mis
node_modules
carpetas antes de hacer una copia de seguridad de mi trabajo en progreso usandorsync
. Un requisito clave es que lanode_modules
carpeta se puede anidar, por lo que necesita la-prune
opción.Primero ejecuté esto para verificar visualmente las carpetas que se eliminarán:
Luego ejecuté esto para eliminarlos a todos:
Gracias a pistache
fuente
sh #!/bin/bash echo "Found node_modules: "; find -type d -name node_modules -prune; read -r -p "Do you really want to delete all directories? [yes/no] " input; if [ ! $input != "yes" ]; then find -type d -name node_modules -prune -exec rm -rf {} \;; fi
Debería hacer el truco. ADVERTENCIA, si bombea accidentalmente una
.
o/
enxargs rm -Rf
toda su computadora, se eliminará sin una opción para recuperarla, lo que requerirá la reinstalación del sistema operativo.fuente
Tenía más de 100 archivos como
las respuestas anteriores no me funcionaron
pero el siguiente comando me ayudó.
di
-type
como.
así elimina archivos y carpetas que comienza conlog-
y
rm -rf
elimina carpetas de forma recursiva incluso si tiene archivos.si quieres carpetas solo
archivos solos
fuente
Combinando múltiples respuestas, aquí hay un comando que funciona tanto en Linux como en MacOS
fuente
Otro:
fuente
-delete
no elimina las carpetas no vacías.Este comando me funciona. Hace su trabajo recursivamente
. - carpeta actual
"node_modules" - nombre de la carpeta
fuente
buscar ruta / a / las / carpetas -maxdepth 1 -name "my_ *" -type d -delete
fuente