Mi directorio de nivel superior es data
. data
incluye varios directorios y estos directorios tienen subdirectorios. Necesito eliminar todos los archivos y directorios dentro, data/
excepto varios archivos en algunos directorios.
Por ejemplo, los datos incluyen los directorios 100
y 101
. Yo sólo quiero seguir a.txt
y b.txt
archivos en 100/
y c.txt
y d.txt
archivos en 101/
mientras se quita todos los demás archivos y directorios en 100
y 101
.
Ejemplo:
.
├── 100
│ ├── a.txt
│ ├── b.txt
│ ├── c.txt
│ └── d.txt
└── 101
├── a.txt
├── b.txt
├── c.txt
└── d.txt
Uso el rm -rf !(a.txt|b.txt)
comando pero no puedo aplicar este comando para cada directorio automáticamente.
fuente
rm
debe saber qué archivos mantener en qué directorios si no desea especificar eso.Podrías usar
find
para esto. Puede negar las pruebasfind
con-not
o!
. Esto excluirá coincidencias, en lugar de encontrarlas.Debe tener cuidado de no eliminar ninguno de los directorios principales de los archivos que desea conservar, especialmente el directorio actual
.
, por lo que debe asegurarse de leer detenidamente el resultado antes de eliminarlo.Según su ejemplo, podría hacer algo así desde el
data
directorio.Agregue un
! -path ./path/to/dir
para cualquier ruta que desee evitar eliminar. Puede usar metacaracteres como*
, pero asegúrese de citar la expresión si lo hace, por ejemplo"./path*dir"
, para evitar expansiones no deseadas.find
es recursivo por defecto. Incluso si no encontramos./100
aquí, encontraremos todo su contenido a menos que coincidan con el patrón[ab].txt
. Si no puede coincidir con todos los nombres que desea conservar, agregue otra prueba:Esto no encontrará
a.txt
ob.txt
ofoo
, pero encontrará todos los demás archivos.Cuando esté seguro de ver lo que quiere, puede agregar
-delete
al final para eliminar los archivos encontrados:fuente