GNU/Linux >> Tutoriales Linux >  >> Linux

¿Usar Buscar para encontrar cierto directorio y eliminar todos los archivos excepto un directorio?

Tengo el siguiente problema. Tengo una estructura de directorios y quiero eliminar todo lo que está dentro de un directorio llamado Caches . Todo debe eliminarse excepto todos los directorios llamados Snapshots . No sé cómo hacer esto con buscar o cualquier otro comando que conozca.

La razón por la que pregunto:en iOS, cada aplicación tiene su propio directorio de cachés. Estos a veces no se borran correctamente, dependiendo de la aplicación. Con la solución a esta respuesta, uno podría borrar cachés en iOS y, por lo tanto, optimizar el espacio en disco, cuando la unidad de los dispositivos está montada en otra computadora, p. con FUSIBLE (iExplorer).

Esto es lo que tengo hasta ahora:

find . 2>/dev/null -type d -name "Caches" -maxdepth 3 -print

Esto devuelve algo como:

./Library/Caches

Cuando hago un ls ./Library/Caches Veo todo el contenido y las Snapshots directorio, que quiero excluir porque en última instancia quiero -delete todo menos este.

Quiero algo como esto:

  Before:                            After:

  .                                  .
  ├── a                              ├── a
  │   ├── a                          │   ├── a
  │   └── Caches                     │   └── Caches
  │       ├── a                      │       └── a
  │       │   └── Snapshots          │           └── Snapshots
  │       │       └── a              │               └── a
  │       ├── b                      └── b
  │       │   └── a                      └── c
  │       └── c                  
  └── b
      ├── c
      └── Caches
          ├── a
          │   └── foo
          │       └── a
          └── b
              └── a

Respuesta aceptada:

find . -depth -print0 | perl -0lne '
  if ("$_/" =~ m{/Caches(/.*)}s && $1 !~ m{/Snapshots/}) {rmdir $_ or unlink $_}'

Si tu find no es compatible con -print0 , puede reemplazarlo con -exec printf '%s\0' {} + .

La idea es imprimir la lista de archivos terminados en NUL (ya que 0 es el único byte que no puede aparecer en una ruta de archivo) y usar perl ‘s -n con -0 opción para ejecutar algún código para cada uno de esos nombres de archivo (con $_ establecido en el nombre de archivo).

Con -depth , los archivos se imprimen antes de su directorio principal. Eliminamos solo archivos o directorios (suponiendo que estén vacíos, por lo que es importante procesar la lista en depth) order) si su ruta contiene /Caches/ no seguido de /Snapshosts/ .


Linux
  1. 3 formas de eliminar todos los archivos de un directorio excepto uno o algunos archivos con extensiones

  2. Cambiar el nombre de todos los archivos y nombres de directorios a minúsculas en Linux

  3. Cómo encontrar y copiar cierto tipo de archivos de un directorio a otro en Linux

  4. ¿Cómo usar Wc And Piping para encontrar cuántos archivos y directorios hay en un determinado directorio?

  5. ¿Eliminar todos los archivos excepto en un determinado subdirectorio con Buscar?

Cómo encontrar y eliminar archivos duplicados en Linux

Encuentre y elimine el archivo más antiguo si hay más de X archivos en un directorio en Linux

Cómo obtener todos los archivos que excedan cierto tamaño y eliminarlos

¿Puedes cambiar el permiso a todos los archivos excepto a un directorio en Linux?

Eliminar todos menos 1000 archivos aleatorios en un directorio

¿Cómo puedo eliminar recursivamente todos los archivos y directorios vacíos en Linux?