El problema
Tengo una estructura de directorio, por ejemplo, algo como esto (aquí las barras inclinadas representan carpetas):
./A
./B/A/A
./B/A/B
./B/B/
./B/C
./C/
Y necesito eliminar recursivamente todo excepto algunos archivos y directorios:
./A
./B/A
Después de ejecutar el comando / script que estoy buscando, quiero que quede la siguiente jerarquía:
./A
./B/A/A
./B/A/B
El intento de solución
Traté de usar find( -printes un marcador de posición):
find \( -path ./A -or -path ./B/A \) -prune -or -print
Esto no funciona porque elimina los directorios principales de las entradas en la lista "no tocar":
$ find \( -path ./A -or -path ./B/A \) -prune -or -print
.
./B
./B/B
./B/C
./C
Especialmente, esto elimina ./Bmientras necesito mantener ./B/A. Diablos, elimina el directorio actual, después de todo.
Quiero evitar las invocaciones recursivas (es decir find -exec something-that-calls-find.sh), ya que las listas de directorios que manejaré son bastante grandes ...
fuente

./By, por lo tanto, lo eliminará a./B/Apesar de que esté en la lista "ignorar".-exec rm -rf {} \; -pruney eliminar.*parte de la expresión regular, al menos en términos de rendimiento; 2) He encontrado una solución más fácil de escribir (sin ruta-> transformación de expresiones regulares); Lo publicaré en breve.Aquí está mi propia solución para eso.
NOTA: No soy un gran amante de la portabilidad cuando se trata de shell y utilidades, por lo que posiblemente depende en gran medida de Bash 4 y GNU find.
Código
Explicación
La
findlínea de comando resultante se construye como una cadena de-predicates -actions -orsecuencias.Esto significa lo siguiente: para cada ruta, si tiene
-predicateséxito, haga-actions, de lo contrario continúe con la siguiente secuencia. El último elemento de la cadena es justo-actions, que es el caso predeterminado.Aquí, estoy haciendo
-prunetodos los parches encontrados directamente en$EXCEPTIONS. Esto dejafindde descender más allá de estos nombres.A continuación, no estoy haciendo nada por todos los padres de padres
$EXCEPTIONS. No queremos eliminar los directorios principales de excepciones, ya que la eliminación es recursiva.Finalmente, estoy alimentando todos los parches restantes (el caso predeterminado) a
xargs rm -r. Esto es más rápido que-exec rm -r {} \;porque solo sermgenerará uno .También lo hago
-prunepor ellos porque no tiene sentido eliminarlos explícitamente./A/B/Csi vamos a eliminarlos./A/B.PD: esto terminó en mi biblioteca de fragmentos :)
fuente