Dúvida com comando find - extensões específicas e nomes de arquivos com acentos

Iniciado por elisson_andrade, 29 de Julho de 2017, 01:28

tópico anterior - próximo tópico

elisson_andrade

Gente,

Estou tentando automatizar umas coisas no meu servidor de arquivos.
Eu faço backup para ele através do sFTP de 3 tipos de arquivos: .jpg, .cr2 e .xmp.

Com 30 dias após modificados eu quero que os arquivos .cr2 e .xmp sejam apagados automaticamente.

Pensei: farei um comando e agendarei no crontab. Até aí ok.

Montei o seguinte comando:
find /media/Dados -type f -mtime +30 -iname '*.cr2' -o -iname '*.xmp' | while read localizados; do rm -f "$localizados"; done

Inicialmente tive problemas com os arquivos que tinham espaçamento entre palavras, por isso adotei o while read acompanhado do rm -f.

O comando rolou muito bem pra arquivos que não tinham acentos, porém há arquivos com acentos que não foram excluídos. Pesquisei um tanto mas não consegui achar a solução.

A princípio, não posso fazer um script para renomear todos os arquivos com acentos pq o programa que faz o backup para o servidor não vai mais reconhecer os arquivos renomeados e eu vou perder o vínculo, tirando a automação do processo de recuperação (se necessário), então já descartei a possibilidade de trocar os caracteres.

Alguma sugestão?

zekkerj

Tem uma coisa que eu não consigo entender, é pq as pessoas investem tanto tempo reinventando a roda, quando se trata de ambiente de backup.
Não se faz isso com suíte de escritório, não se faz isso com edição de vídeo, não se faz isso com roteamento (aliás, com roteamento, fazem sim...)...

Antes de comentar sobre o comando "find", vou te recomendar: não perde seu tempo brigando com scripts de backup, amigo. Investe em pacotes prontos, como o Bacula e o Amanda.

Sobre o comando "find", se vc pretende executar um comando em cima dos arquivos encontrados, use o predicado "-exec". Seu comando ficaria assim:

find /media/Dados -type f -mtime +30 -iname '*.cr2' -o -iname '*.xmp' -exec rm -f \{\} \;
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

elisson_andrade

Citação de: zekkerj online 29 de Julho de 2017, 06:27
Tem uma coisa que eu não consigo entender, é pq as pessoas investem tanto tempo reinventando a roda, quando se trata de ambiente de backup.
Não se faz isso com suíte de escritório, não se faz isso com edição de vídeo, não se faz isso com roteamento (aliás, com roteamento, fazem sim...)...

Antes de comentar sobre o comando "find", vou te recomendar: não perde seu tempo brigando com scripts de backup, amigo. Investe em pacotes prontos, como o Bacula e o Amanda.

Sobre o comando "find", se vc pretende executar um comando em cima dos arquivos encontrados, use o predicado "-exec". Seu comando ficaria assim:

find /media/Dados -type f -mtime +30 -iname '*.cr2' -o -iname '*.xmp' -exec rm -f \{\} \;

Amigo, agradeço a resposta...

A respeito do Bacula, li sobre ele, gostei, mas não vi algo tratando a respeito da exclusão de arquivos determinados (no meu caso .cr2 e .xmp) com o passar do tempo. Existe tal opção anexa ao programa?

E sobre o comando, simplesmente não aconteceu nada utilizando ele... Para testes utilizei um "-mmin +1" e nenhum arquivo foi apagado...
Para efeito de teste, depois apenas listei os aquivos com o comando:
find /media/Dados/Teste -type f -mmin +1 -iname '*.cr2' -o -iname '*.xmp'

e no terminal, mostrou até o arquivo que criei de testes (que contém espaços no nome e acentos).



Acredito que o problema seja o comando final...

irtigor

Se é pra apagar o gnu find tem o "-delete", que é menos propenso a erros (falta de escape, escolha ineficiente e coisa do tipo). Com {} \; o comando passado é executado pra cada ocorrência, enquanto que com {} \+ todas as ocorrências são juntadas e depois o comando é executado. Se for usar com xargs é recomendado passar "-print0" pro find e "-0" pro xargs.

elisson_andrade

Citação de: irtigor online 29 de Julho de 2017, 09:58
Se é pra apagar o gnu find tem o "-delete", que é menos propenso a erros (falta de escape, escolha ineficiente e coisa do tipo). Com {} \; o comando passado é executado pra cada ocorrência, enquanto que com {} \+ todas as ocorrências são juntadas e depois o comando é executado. Se for usar com xargs é recomendado passar "-print0" pro find e "-0" pro xargs.

o -delete funcionou perfeitamente! Eu tinha tentado ele (acredito que com a sintax errada) antes.

Fiz assim:
find /media/Dados/Teste -type f -mmin +1 -iname '*.cr2' -delete -o -iname '*.xmp' -delete

zekkerj

Citação de: elisson_andrade online 29 de Julho de 2017, 09:43
Amigo, agradeço a resposta...

A respeito do Bacula, li sobre ele, gostei, mas não vi algo tratando a respeito da exclusão de arquivos determinados (no meu caso .cr2 e .xmp) com o passar do tempo. Existe tal opção anexa ao programa?
Não há uma opção explícita pra remover arquivos depois de efetuar o backup, mas todo job tem um script que pode ser executado antes ou depois do backup. Você pode usar esse script pra remover seus arquivos.

CitarE sobre o comando, simplesmente não aconteceu nada utilizando ele... Para testes utilizei um "-mmin +1" e nenhum arquivo foi apagado...
Para efeito de teste, depois apenas listei os aquivos com o comando:
find /media/Dados/Teste -type f -mmin +1 -iname '*.cr2' -o -iname '*.xmp'

e no terminal, mostrou até o arquivo que criei de testes (que contém espaços no nome e acentos).



Acredito que o problema seja o comando final...
Rapaz, canso de usar esse predicado "-exec". Mas pelo menos vc já achou uma alternativa.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

druidaobelix

Citação de: zekkerj online 30 de Julho de 2017, 07:45
Rapaz, canso de usar esse predicado "-exec". Mas pelo menos vc já achou uma alternativa.

É que nesse caso o comando passado está usando o operando lógico -o, que equivale ao OR, ou seja, existem de fato duas condições, arquivos .cr2 e .xmp, que equivalem a duas expressões, então o predicado -exec vai funcionar apenas em relação ao último, por isso que não funcionou, ou seja, se separar em duas linhas funciona, mas sem dúvida a opção --delete apontada é a opção de escolha para o caso, pelas razões bem mencionadas pelo @irtigor.
www.arredondar.org.br
Vencedor Desafio de Impacto Social Google 2016!
Você também pode participar e fazer a diferença.