Necesito eliminar todas las carpetas dentro de una carpeta usando un script diario. La carpeta para ese día debe dejarse.
La carpeta 'myfolder' tiene 3 subcarpetas: 'test1', 'test2' y 'test3'. Necesito eliminar todo excepto 'test2'.
Estoy tratando de hacer coincidir el nombre exacto aquí:
find /home/myfolder -type d ! -name 'test2' | xargs rm -rf
O
find /home/myfolder -type d ! -name 'test2' -delete
¡Este comando siempre intenta eliminar la carpeta principal 'myfolder' también! Hay alguna manera de evitar esto ?

!operador:\!o'!'.Respuestas:
Esto eliminará todas las carpetas dentro,
./myfolderexcepto que./myfolder/test2se conservará todo su contenido:Cómo funciona
findinicia un comando de búsqueda../myfolderle dice a find que comience con el directorio./myfoldery sus contenidos.-mindepth 1no coincidir./myfolder, solo los archivos y directorios debajo de él.! -regex '^./myfolder/test2\(/.*\)?'le dice a find que excluya (!) cualquier archivo o directorio que coincida con la expresión regular^./myfolder/test2\(/.*\)?.^coincide con el inicio del nombre de la ruta. La expresión(/.*\)?coincide con (a) una barra inclinada seguida de algo o (b) nada en absoluto.-deletele dice a find que elimine los archivos coincidentes (es decir, no excluidos).Ejemplo
Considere una estructura de directorio que se parece a;
Podemos ejecutar el comando find (sin
-delete) para ver qué coincide:Podemos verificar que esto funcionó mirando los archivos que quedan:
fuente
-prunedejar lostest2/*/subdirectorios solos: volverrm -ry agregar-maxdepth 1../myfolder. Necesita una falta (IMvhO) solo-type dpara directorios .find ./myfolder -depth -mindepth 1 -maxdepth 1 -type d ! -regex '^./myfolder/test2\(/.*\)?'Usando bash :
Ejemplo:
fuente
tl; dr
Elimine echo si está satisfecho con la lista de archivos.
El uso
-mindepth 1garantizará que el directorio superior no esté seleccionado.Sin embargo, una
-not -name test2será no evitar subdirectorios en el interiortest2:Para hacer eso, necesitas algo como ciruela pasa:
Pero no lo use
delete, como implicadepthy eso comenzará a borrarse del camino más largo:Utilice
rm -rf(elimineechosi realmente desea borrar):O use también
maxdepthsi todo lo que necesita es eliminar directorios (y todo lo que está dentro) (elimine elechopara borrar realmente):A
-deletetodavía fallará si el directorio no está vacío:fuente
Si está usando zsh, entonces podría:
fuente
Probado con el siguiente comando y funcionó bien
fuente
-mindepth 1) hace que el directorio superior coincida con todos los criterios (es un directorio y no se llama "test2") y, por lo tanto, se elimina.