Estou tentando escrever um script para excluir arquivos de um diretório.
find /home/docs/* -name "*.log" -type f -print -exec rm -f {} \;
O procedimento acima funciona, mas preciso usar grep para direcionar diretórios usando grep. Quando coloco grep, recebo falhas.
find /home/docs/* -name "*.log" -type f | grep -i "Testing"-print -exec rm -f {} \;
Estrutura de diretório.
/home/docs/2023/01/Testing/
/home/docs/2024/01/Testing/
/home/docs/2024/02/Approve/
/home/docs/2022/01/Testing/
Preciso remover log
do Testing
diretório. Posso usar o grep com o find, mas quando tento usar -exec
para remover os arquivos, recebo erros. Eu tentei muitas combinações diferentes.
Trabalhando para listar apenas os arquivos find /home/docs/* -name "*.log" -type f | grep -i "Testing"
Obtendo uma lista de arquivos
/home/docs/2023/01/Testing/3.log
/home/docs/2023/aisle/drawing/01/Testing/2.log
/home/docs/2023/drawing/Testing/1.log
Adicionar -exec não exclui find /home/docs/* -name "*.log" -type f | grep -i "Testing" -exec rm -f {} \;
Esta iteração não estou recebendo um erro apenas obtendogrep: {}: No such file or directory
você não precisa
grep
; você precisa ler a página de manual dofind
;man find
!Lá, você encontrará (pesquise "regex", digitando /
regex
) que-iregex
você pode combinar com regexes. No entanto, você nem precisa de regexes!E você também descobrirá que a exclusão pode ser feita sem
-exec
:é isso. Sem casos estranhos, sem problemas com quebras de linha, sem chamadas
grep
.Se você realmente precisar de regexes:
Mas, para o seu problema, você não precisa de regexes.
Na verdade, você nem precisa
find
! Seu shell pode glob (completar nomes de arquivos automaticamente) bem o suficiente para esta tarefa:Em
bash
(provavelmente o shell que você está usando, a menos que você saiba o contrário), um simplesfaria¹. No
zsh
, você nem precisa definir nenhuma opção especial, então é simplesrm -f /home/docs/(#i)**/*Testing*/*.log(.)
se você estiver usandozsh
e tiverextendedglob
habilitado. Isso(#i)
faz com que o restante do globo não faça distinção entre maiúsculas e minúsculas², o final(.)
corresponde apenas a arquivos regulares.¹ cuidado, pois isso
/home/docs/**/Testing/**/*.log
não seria encontrado/home/docs/x/testing/file.log
, pois apenas os/
componentes delimitados que possuem operadores glob são afetados pornocaseglob
. Você precisaria,/home/docs/**/[T]esting*/**/*.log
por exemplo, que issoTesting
não diferenciasse maiúsculas de minúsculas. Isso é diferente com zsh's(#i)
² altere para
/home/docs/**/*((#i)Testing)*/*.log(.)
para que a insensibilidade entre maiúsculas e minúsculas se aplique apenas aTesting
(e nãolog
).Um desses. (O primeiro funcionará em muitas plataformas, o segundo funcionará em todas.)
Se o seu primeiro exemplo de estrutura de diretórios estiver correto, uma simples expansão glob do shell poderá funcionar ainda mais facilmente (assumindo que não haja "muitos" arquivos correspondentes às expansões:
Conforme mencionado nos comentários da sua postagem:
find
, sem usargrep
-exec
não é uma opção que você possa passargrep
Porém, se você quiser usar
grep
mesmo assim, eu recomendaria usarxargs
, assim:Ou, para funcionar corretamente mesmo quando houver arquivos com espaços em branco, aspas, apóstrofo ou barra invertida em seu caminho: