Esse é um código que eu apenas testei grosseiramente, mas que poderia ter uma abordagem para você. Supondo que você tenha um arquivo, ignore.txt
assim:
1/
2/
Dados de amostra
E eu tinha diretórios de amostra com arquivos neles assim:
$ mkdir -p dirs/{1..5}
$ touch dirs/{1..5}/afile
Resultando nisso:
$ tree dirs/
dirs/
|-- 1
| '-- afile
|-- 2
| '-- afile
|-- 3
| '-- afile
|-- 4
| '-- afile
'-- 5
'-- afile
Exemplo de execução
Agora, se executarmos este comando nessa árvore:
$ find dirs/ -type f -print0 | fgrep -zFvf ./ignore.txt
dirs/5/afiledirs/4/afiledirs/3/afile
Podemos ver que estamos recuperando apenas os arquivos que estão nos diretórios não listados em ignore.txt
.
Portanto, podemos adicionar um rm
ao final para remover os arquivos não excluídos.
$ find dirs/ -type f -print0 | fgrep -zFvf ./ignore.txt | xargs -0 rm -f
Verificamos que podemos ver que funcionou:
$ tree dirs/
dirs/
|-- 1
| '-- afile
|-- 2
| '-- afile
|-- 3
|-- 4
'-- 5
Problemas a serem resolvidos
Um grande problema com essa abordagem é que as sequências no arquivo ignore.txt
podem corresponder a outras partes da estrutura de diretórios. Portanto, alguns cuidados devem ser pagos para garantir que as strings neste arquivo sejam exclusivas da maneira esperada.
Alguns bloqueios podem ser colocados em torno das strings de modo que estejam ancorados no começo ou no final da string para protegê-los.
Detalhes
Os comandos acima estão fazendo o seguinte:
- localizando todos os arquivos no diretório
dirs
- filtrando todos os arquivos que estão sob um diretório presente no arquivo
igonre.txt
- passando a lista de filtros via
xargs
para o comandorm -f