O comando Localizar falha ao copiar alguns arquivos

1

Estou usando o comando abaixo para copiar arquivos criados no último minuto. Eu agendei o script que contém este comando para executar a cada um minuto, para que os arquivos possam ser copiados assim que o arquivo é criado no local a / b / c. Mas, de alguma forma, esse comando falha ao copiar um ou vários arquivos às vezes. Existe alguma desvantagem no comando find? ou há algum erro no comando seguinte?

find /a/b/c -type f -mmin -1 -exec cp {} /x/y/z \;
    
por M.Nehru 19.06.2015 / 17:55

1 resposta

2

Você pode usar find com um sinalizador de carimbo de data / hora para que ele pegue todos os arquivos desde a última execução, independentemente de quanto tempo atrás foi. Sinta-se à vontade para substituir a definição de $trigger por algo mais apropriado.

trigger=/tmp/trigger

touch "$trigger.new"
test ! -f "$trigger" && touch "$trigger"

find /a/b/c -newer "$trigger" -type f -exec cp -f {} /x/y/z +
mv -f "$trigger.new" "$trigger"

Isso ainda falhará em situações em que o mtime é redefinido após o arquivo ter sido completamente gravado.

Ele também falhará se o arquivo de origem estiver sendo gravado quando esse código for executado. Vale a pena se proteger contra esse cenário, a menos que você possa garantir que seus arquivos de origem apareçam atomicamente. Uma maneira de lidar com isso é que seus arquivos sejam gravados com um sufixo .tmp (ou .part ) e renomeados pelo remetente apenas quando estiverem completos. O find neste script acionador aqui seria modificado para excluir arquivos cujos nomes terminam com .tmp (ou .part ).

Você também pode usar rsync , mas esteja ciente de que os caminhos de diretório na origem seriam copiados para o destino, o que pode não ser o que você deseja. Substitua o snippet acima por esta única linha:

rsync -a /a/b/c/ /x/y/z/
    
por 19.06.2015 / 18:45

Tags