find: exclui pastas e subpastas, mas adiciona exceções a dois arquivos

2

Estou tentando usar o comando find para fazer o seguinte: Exclua uma pasta inteira com arquivos, pastas e subpastas, exceto dois arquivos, aqui está um exemplo do que preciso:

 test/folder1/file1.txt
 test/folder1/file2.txt
 test/folder1/subfolder1/
 test/folder1/subfolder1/file3.txt
 test/folder1/subfolder1/subfolder2/file4.txt
 test/folder2/file5.txt
 test/folder3/file6.txt

Preciso excluir tudo, exceto file2.txt e file3.txt

Aqui está o que eu já fiz

 find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt'

Isso me listará todos os arquivos, exceto os que eu especifiquei. No entanto, se eu adicionar -exec rm -rf {} até o final do comando, ele excluirá tudo.

Eu também tentei esse outro comando e não funcionou

rm -r  test/folder1/ !(file2.txt|file3.txt)

Eu não sei muito sobre expressão regular, então estou tentando fazer com que funcione testando comandos que encontrei online, mas nenhum deles parece estar funcionando.

    
por gabrielpasv 14.04.2016 / 20:03

2 respostas

1

Não chame rm -rf . Assim que você executá-lo em um diretório, isso exclui todos os arquivos no diretório e nos subdiretórios, até mesmo os que você deseja manter. Mais geralmente, não chame rm -rf a menos que você saiba por que um simples rm não funcionará. Aqui, rm -f é garantido se você quiser ter certeza de que seu script não solicitará a confirmação para excluir um arquivo somente leitura, mas -r claramente não é garantido.

Para excluir apenas os arquivos:

find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a -exec rm -f {} +

Se você também quiser excluir os diretórios que ficarem vazios, chame rmdir neles. Use -depth para que o conteúdo do diretório seja considerado antes do próprio diretório.

find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a \( -type d rmdir {} \; -o -exec rm -f {} \; \)

Você receberá erros de rmdir em execução em diretórios não vazios, eles são irritantes, mas inofensivos.

Se a sua descoberta tiver -delete e -empty (por exemplo, encontrar GNU), não será necessário chamar rm e rmdir .

find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a ! -type d ! -empty -delete
    
por 15.04.2016 / 01:00
0

Olha, eu também não sei de improviso como fazer isso com as opções find , mas você também pode usar o shell script em você find :

Primeiro, apague os arquivos:

 find . -type f -exec bash -c \
    ' [[ "{}" == "./test/folder1/file2.txt" || \
         "{}" == "./test/folder1/subfolder1/file3.txt" ]] \
      || rm "{}" ' \;

E, em seguida, elimine todas as pastas não vazias:

find .  -type d -exec rmdir {} \; 2>/dev/null
    
por 14.04.2016 / 21:05