Autor Tópico: Dúvida com comando find - extensões específicas e nomes de arquivos com acentos  (Lida 4899 vezes)

Offline elisson_andrade

  • Usuário Ubuntu
  • *
  • Mensagens: 3
    • Ver perfil
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:
Código: [Selecionar]
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?
« Última modificação: 29 de Julho de 2017, 01:31 por elisson_andrade »

Offline zekkerj

  • Usuário Ubuntu
  • *
  • Mensagens: 19.735
  • Gratidão gera gratidão, lamúria atrai lamúria...
    • Ver perfil
    • Blog do Zekke
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:

Código: [Selecionar]
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

Offline elisson_andrade

  • Usuário Ubuntu
  • *
  • Mensagens: 3
    • Ver perfil
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:

Código: [Selecionar]
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:
Código: [Selecionar]
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...

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
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.

Offline elisson_andrade

  • Usuário Ubuntu
  • *
  • Mensagens: 3
    • Ver perfil
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:
Código: [Selecionar]
find /media/Dados/Teste -type f -mmin +1 -iname '*.cr2' -delete -o -iname '*.xmp' -delete

Offline zekkerj

  • Usuário Ubuntu
  • *
  • Mensagens: 19.735
  • Gratidão gera gratidão, lamúria atrai lamúria...
    • Ver perfil
    • Blog do Zekke
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.

Citar
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:
Código: [Selecionar]
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

Offline druidaobelix

  • Usuário Ubuntu
  • *
  • Mensagens: 5.552
    • Ver perfil
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.