linux – Eliminar todas las carpetas dentro de una carpeta excepto una con un nombre específico

Pregunta:

Necesito eliminar todas las carpetas dentro de una carpeta usando un script diario. Es necesario dejar la carpeta de ese día.

La carpeta 'myfolder' tiene 3 subcarpetas: 'test1', 'test2' y 'test3' Necesito eliminar todos 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 ?

Respuesta:

Esto eliminará todas las carpetas dentro de ./myfolder excepto que ./myfolder/test2 y todo su contenido se conservará:

find ./myfolder -mindepth 1 ! -regex '^./myfolder/test2\(/.*\)?' -delete

Cómo funciona

  • find inicia un comando de búsqueda.
  • ./myfolder le dice a find que comience con el directorio ./myfolder y su contenido.

  • -mindepth 1 para que no coincida con ./myfolder sí, solo los archivos y directorios que se encuentran debajo.

  • ! -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 cualquier cosa 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;

$ find ./myfolder
./myfolder
./myfolder/test1
./myfolder/test1/dir1
./myfolder/test1/dir1/test2
./myfolder/test1/dir1/test2/file4
./myfolder/test1/file1
./myfolder/test3
./myfolder/test3/file3
./myfolder/test2
./myfolder/test2/file2
./myfolder/test2/dir2

Podemos ejecutar el comando de búsqueda (sin -delete ) para ver qué coincide:

$ find ./myfolder -mindepth 1 ! -regex '^./myfolder/test2\(/.*\)?'
./myfolder/test1
./myfolder/test1/dir1
./myfolder/test1/dir1/test2
./myfolder/test1/dir1/test2/file4
./myfolder/test1/file1
./myfolder/test3
./myfolder/test3/file3

Podemos verificar que esto funcionó mirando los archivos que quedan:

$ find ./myfolder
./myfolder
./myfolder/test2
./myfolder/test2/file2
./myfolder/test2/dir2

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım