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,
./myfolder
excepto que./myfolder/test2
se conservará todo su contenido:Cómo funciona
find
inicia un comando de búsqueda../myfolder
le dice a find que comience con el directorio./myfolder
y sus contenidos.-mindepth 1
no 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.-delete
le 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
-prune
dejar lostest2/*/
subdirectorios solos: volverrm -r
y agregar-maxdepth 1
../myfolder
. Necesita una falta (IMvhO) solo-type d
para 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 1
garantizará que el directorio superior no esté seleccionado.Sin embargo, una
-not -name test2
será no evitar subdirectorios en el interiortest2
:Para hacer eso, necesitas algo como ciruela pasa:
Pero no lo use
delete
, como implicadepth
y eso comenzará a borrarse del camino más largo:Utilice
rm -rf
(elimineecho
si realmente desea borrar):O use también
maxdepth
si todo lo que necesita es eliminar directorios (y todo lo que está dentro) (elimine elecho
para borrar realmente):A
-delete
todaví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.