Dado um arquivo de texto contendo caminhos que desejo manter como:
/mnt/cache/vfs/cf/A/file
/mnt/cache/vfs/cf/B/file2
E quero limpar todo o resto, /mnt/cache/vfs/cf
a menos que esteja no meu arquivo de texto
Então /mnt/cache/vfs/cf/Z/file3
é excluído, etc.
O arquivo de texto é enorme e possui nomes de arquivos com espaços e possíveis acentos ou outros caracteres especiais
Eu listaria os arquivos no sistema de arquivos, removeria aqueles que existem no seu conjunto de arquivos a serem mantidos e excluiria o restante.
Aqui eu usei nomes de arquivos terminados em NULL para que não haja confusão
xargs
entre um nome de arquivo contendo espaços e suas partes separadas por espaço:Substitua
printf '%s\n'
porrm --
quando estiver pronto para realizar as exclusões.O
comm
comando pega dois arquivos classificados e os compara linha por linha. A primeira coluna de saída contém entradas apenas no primeiro arquivo, a segunda contém entradas apenas no segundo arquivo e a terceira contém entradas em ambos os arquivos. Os qualificadores-1
,-2
e-3
inibem a saída da coluna correspondente, portanto,comm -23
geraremos linhas que estão presentes apenas no primeiro arquivo (-
, ou seja, stdin ).Eu forcei o código do idioma para
C
quesort
funcionassemcomm
de maneira consistente entre si (comm
requer entrada classificada) e também para que cada linha fosse classificada de maneira determinística (alguns locais classificam os conjuntos de caracteres da mesma forma, então os caracteres em tal um conjunto pode ser ordenado de maneira inconsistente).O que eu faria:
Quando estiver satisfeito com o resultado, você pode inserir todo o snippet
bash
:Consulte http://mywiki.wooledge.org/glob#extglob
e https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html
Eu usaria uma linha simples como esta:
Mas eu, dependendo de quantos arquivos você deseja excluir, recomendo sempre movê-los para um diretório temporário, para ter certeza de não remover um arquivo necessário por acidente :)