Meu diretório de nível superior é data
. data
inclui vários diretórios e esses diretórios têm subdiretórios. Eu preciso remover todos os arquivos e diretórios dentro, data/
exceto vários arquivos em alguns diretórios.
Por exemplo, os dados incluem os diretórios 100
e 101
. Eu só quero manter a.txt
e b.txt
arquivos 100/
e c.txt
e d.txt
arquivos 101/
ao remover todos os outros arquivos e diretórios em 100
e 101
.
Exemplo:
.
├── 100
│ ├── a.txt
│ ├── b.txt
│ ├── c.txt
│ └── d.txt
└── 101
├── a.txt
├── b.txt
├── c.txt
└── d.txt
Eu uso o rm -rf !(a.txt|b.txt)
comando, mas não posso aplicar esse comando para cada diretório automaticamente.
fonte
rm
deve saber quais arquivos manter em quais diretórios, se você não quiser especificar isso.Você poderia usar
find
para isso. Você pode negar testesfind
com-not
ou!
. Isso excluirá correspondências, em vez de encontrá-las.Você deve tomar cuidado para não excluir nenhum dos diretórios pai dos arquivos que deseja manter, especialmente o diretório atual
.
, portanto, leia a saída cuidadosamente antes de excluir.Com base no seu exemplo, você pode fazer algo assim no
data
diretórioAdicione a
! -path ./path/to/dir
para qualquer caminho que você deseja evitar a exclusão. Você pode usar metacaracteres como*
, mas certifique-se de citar a expressão se o fizer, por exemplo"./path*dir"
, para evitar expansões indesejadas.find
é recursivo por padrão. Mesmo se não encontrarmos./100
aqui, encontraremos todo o seu conteúdo, a menos que eles correspondam ao padrão[ab].txt
. Se você não conseguir corresponder a todos os nomes que deseja manter, adicione outro teste:Isso não encontrará
a.txt
oub.txt
oufoo
, mas encontrará todos os outros arquivos.Quando tiver certeza de que vê o que deseja, você pode adicionar
-delete
ao final para excluir os arquivos encontrados:fonte