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/
.