mv dentro do shell script não move arquivos

1

Muitas vezes discutido, mas as respostas não me levaram a uma solução, infelizmente, e estou um pouco envergonhado por precisar fazer essa pergunta novamente. Mas aqui estamos nós.

Eu tenho um script de shell dosomething.sh com o shebang #!/bin/bash .

Dentro deste script eu tenho a seguinte linha para copiar arquivos de um determinado tipo de um diretório para outro:

find "/var/www/analysis_xyz/" -name '*log.gz' -exec mv -f {} "/media/pi/MOBIDICDATA" \;

Quando o script é executado, nada é copiado. Estou certo de que isso é apenas uma coisa pequena que estou perdendo. A questão é: o que?

A pergunta em si pode parecer ampla, mas, por favor, observe que eu postei minha própria resposta que resolve o problema. Eu acho que há valor educacional suficiente neste estudo de caso para torná-lo útil para a comunidade.

    
por Frederick Löbig 15.01.2018 / 13:33

1 resposta

0

Graças aos comentários de pôsteres, consegui resolver o problema. Esta é uma versão editada da minha resposta anterior porque foi considerada insuficiente e gerou mais perguntas do que respostas.

Então, aqui estou tentando descrever cada problema que levou ao problema em si e como resolvi isso.

Tentativa 1: sintaxe mv incorreta?

Do script, a seguinte linha não fez nada:

find "/var/www/analysis_xyz/" -name '*log.gz' -exec mv -f {} "/media/pi/MOBIDICDATA" \;

Eu não tinha certeza se poderia usar os parâmetros padrão de mv durante a chamada de um -exec , mas adicionei o parâmetro -f para sobrescrever os arquivos existentes no diretório de destino de qualquer maneira.

Ao adicionar o set -x ao script como sugerido, ele me retornou uma mensagem de erro dizendo que algo está errado com os argumentos do comando mv . Então eu removi o parâmetro -f . Sem sucesso. Após googlar um pouco mais e ver alguns exemplos que todos usaram o parâmetro -t , então eu adicionei. Mais uma vez, sem sucesso, em vez disso eu recebi uma mensagem de erro dizendo que um diretório é esperado, o que eu interpretei errado (desculpe, um pouco de noob sobre shell script). Neste momento eu tive a seguinte sintaxe, que depois ficou absolutamente correta e funcionando:

find /var/www/analysis_xyz/ -name '*log.gz' -exec mv {} -t /media/pi/MOBIDICDATA \;

(observe o movido {} ). Mas no momento o problema ainda não estava resolvido e eu não tinha certeza se -f e -t eram parte dele.

Tentativa nº 2: - Estou tentando gravar em um pendrive USB somente de leitura?

Como você deve ter notado, a pasta de destino é /media/pi/… . Então, você pode estar ciente de que estou usando um Raspberry Pi e estou no Raspbian. O pendrive que eu queria gravar os dados é montado automaticamente nessa pasta (desde que o dispositivo tenha o nome MOBIDICDATA ). A montagem automática montou o dispositivo como somente leitura (e neste momento eu não sabia por quê). Isso fez com que o processo fosse executado, mas nenhum arquivo foi copiado e uma mensagem de erro foi levantada dizendo que o dispositivo era somente leitura.

Eu decidi não confiar na montagem automática e montar o dispositivo sozinho na reinicialização para outro local. O novo destino foi /mobidicdata . O dispositivo foi montado com sucesso, mas ainda assim foi lido por algum motivo.

Tentativa # 3: - A vida é curta para remover o USB com segurança?

No passado eu literalmente matei 2 dispositivos USB removendo-os com segurança de um PC com Windows, então decidi não fazer mais isso, já que eu nunca matei um dispositivo simplesmente puxando-o para fora. Mal sabia eu que, por exemplo Pendrives, que simplesmente foram retirados sempre , são montados como somente leitura na maioria dos sistemas não-Windows; o que faz todo o sentido, já que o sistema de arquivos pode estar corrompido e causar outros problemas. Depois de aprender isso, eu removi o dispositivo USB com segurança, montei e agora era r / w.

Então, teste novamente com o dispositivo gravável e a seguinte sintaxe:

find /var/www/analysis_xyz/ -name '*log.gz' -exec mv {} -t /mobidicdata \;

… o que estava funcionando.

Para mim, este foi um pouco de um Odysee.

Resumo

Sim, o parâmetro -t / -f não foi o problema mencionado anteriormente. Era mais um cluster de múltiplos problemas que eu já deveria ter descrito com mais detalhes anteriormente.

Espero lançar alguma luz sobre a coisa toda e o que sei a partir de agora e farei no futuro:

  • Você definitivamente deve remover o USB com segurança

Infelizmente, não consigo reproduzir completamente o problema acima. Nesse caso, eu poderia ter declarado as mensagens de erro exatas. Mas eu ainda acho que isso dá um pouco mais de conhecimento sobre o que aconteceu e o que foi feito.

    
por 15.01.2018 / 19:04