eliminar subcarpetas sin eliminar la carpeta principal

15

Para este tipo de estructura dir:

/config/filegroups/filegroupA/files/fileA1.txt
/config/filegroups/filegroupA/files/fileA2.txt
/config/filegroups/filegroupB/files/fileB1.txt
/config/filegroups/filegroupB/files/fileB2.txt
...

Sé que puedo usar rm -rf /config/filesgroupspara eliminar la carpeta principal y todas las subcarpetas ...

pero quiero eliminar sólo /filegroupA, /filegroupB, etc., y no elimine/config/filegroups

BaltoStar
fuente
13
¿Hay algún problema para usar rm -rf / config / filesgroups / *?
dsmsk80
3
O tal vez incluso rm -rf /config/filegroups/filegroups{A,B}?
Drav Sloan
@dsumsky Por defecto bashno incluye '.' carpetas en la expansión del nombre de ruta. Lo que puede o no ser deseado. Yo lo hago shopt -s dotgloben .bashrcarreglar eso. Solo una nota al margen que alguien podría encontrar útil;).
Miroslav Koškár
¿Algo de esto funcionó para usted? Si es así, ¿le importaría aceptar una respuesta para ayudar a otros (como yo) que quieran hacer lo mismo?
Mawg dice que reinstale a Monica el
rm -rf /*lo hará;) --- en serio no lo hagas
Muhammad Umer

Respuestas:

28
rm -rf /config/filegroups/*

Si desea eliminar solo directorios (y enlaces simbólicos a directorios), dejando /config/filegroupsintactos los archivos , puede usar una barra diagonal final:

rm -rf /config/filegroups/*/

Si desea eliminar directorios con nombres que comienzan también con un ., suponiendo que tenga un bash bastante reciente, debe usar la opción de shell dotglob:

shopt -s dotglob
rm -rf /config/filegroups/*/
shopt -u dotglob
maldad
fuente
y por favor no que no funcione para rm -rf "/ config / filegroups / *"
Ilya Yevlampiev
5

Esto eliminará todos los archivos y directorios /config/filegroupsincluidos, incluidos los archivos y directorios "ocultos" (nombres que comienzan con .).

find /config/filegroups -mindepth 1 -maxdepth 1 | xargs rm -rf

Si los nombres de archivo o directorio contienen espacios, debe hacerlo así:

find /config/filegroups -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf

Bonificación: primero puede verificar qué se va a eliminar de esta manera:

find /config/filegroups -mindepth 1 -maxdepth 1

Si desea mantener ciertos archivos o directorios, puede hacerlo así:

find /config/filegroups -mindepth 1 -maxdepth 1 -not -name "keep"
lesmana
fuente
¿Hay alguna razón para no usar findla -deleteopción?
evilsoup
44
-deletese niega a eliminar directorios no vacíos. -maxdepthreemplaza -depth, lo cual es necesario -deletepara eliminar directorios no vacíos. Sin -maxdepthusted, no puede ver fácilmente qué directorios se van a eliminar porque también enumera los archivos dentro de los directorios. No usar -maxdepthtambién significa que no puedes usar fácilmente filtros como -name. Además, -deleteelimina los directorios al eliminar primero todos los objetos dentro, lo que puede llevar mucho tiempo si es un árbol grande y profundo.
lesmana
4

Prefiero usar findcon -exec, eso haría que tu llamada sea así:

find /config/filegroups/ -maxdepth 1 -mindepth 1 -type d -exec rm -rf {} \;
Panthro
fuente
-2

Si ya está en la carpeta, simplemente puede escribir rm -rf ./**

Entonces:

cd /config/filesgroups
rm -rf ./**

Este es un patrón global para eliminar todas las subcarpetas de la ruta local.

./refiriéndose a la carpeta local ... y **para todas las carpetas debajo ...

Mantisimo
fuente
1
Qué carpeta y por qué `**` `
RalfFriedl
1
Esto sería exactamente lo mismo que rm -rf ./*, excepto que es probable que reciba mensajes de diagnóstico sobre "No -fexiste tal archivo o directorio" si no está utilizando su comando (ya que el directorio superior se eliminaría recursivamente antes de que se procese su contenido) por rm).
Kusalananda