Mi directorio de nivel superior es data. dataincluye 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 100y 101. Yo sólo quiero seguir a.txty b.txtarchivos en 100/y c.txty d.txtarchivos en 101/mientras se quita todos los demás archivos y directorios en 100y 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

rmdebe saber qué archivos mantener en qué directorios si no desea especificar eso.Podrías usar
findpara esto. Puede negar las pruebasfindcon-noto!. 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
datadirectorio.Agregue un
! -path ./path/to/dirpara 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.findes recursivo por defecto. Incluso si no encontramos./100aquí, 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.txtob.txtofoo, pero encontrará todos los demás archivos.Cuando esté seguro de ver lo que quiere, puede agregar
-deleteal final para eliminar los archivos encontrados:fuente