Use inotifywait para mover o arquivo quando ele for carregado na pasta da caixa de depósito

12

Estou tentando encontrar uma maneira de mover imediatamente um arquivo para outra pasta assim que ele aparecer na minha caixa de depósito no CentOS.

Procurei na Internet algumas pistas, mas não posso ir além do fato de que preciso usar inotifypara chamar um script que processará o arquivo como ele aparece.

Meu conhecimento em BASH é muito limitado e duvido que possa escrever isso em PHP.

Em outras palavras, como posso mover um arquivo para outra pasta assim que aparecer usando inotify?

Ortix92
fonte
O nome do arquivo é sempre previsível? Ou é localização? Mais detalhes seria útil ...
jasonwryan
@jasonwryan É uma pasta dropbox, portanto, a localização é consistente. E isso se aplica a qualquer arquivo solto nessa pasta.
Ortix92

Respostas:

13

Esta é uma abordagem simples:

#!/usr/bin/env bash

dir=/home/ortix/Dropbox/new/
target=/home/ortix/movedfiles/

inotifywait -m "$dir" --format '%w%f' -e create |
    while read file; do
        mv "$file" "$target"
    done

Com mais detalhes sobre os tipos de arquivos que você deseja mover, você pode adicionar algumas verificações, registros, etc.

jasonwryan
fonte
Não pude testar nenhuma das respostas sugeridas. As coisas vieram à tona. Vai fazê-lo o mais rápido possível! Eu tenho uma pergunta, no entanto. Se eu colocar isso em um arquivo bash e executá-lo, presumo que ele será executado em segundo plano, correto? Eu sempre sinto que um script é uma coisa executada uma vez, mas aqui o inotifywait continua sendo executado, correto?
precisa saber é o seguinte
2
a escuta no createevento não está correta, pois você fará um mvem um arquivo que pode não ser totalmente copiado no disco. Veja a resposta do @Gilles, usando o close_writeevento.
Fduff
3
@fduff Vendo resposta Gilles é sempre a coisa certa a fazer ...
jasonwryan
17

O comando inotifywaitimprime uma mensagem sempre que o conteúdo do diretório especificado é alterado. Você precisará escolher o evento certo: não quando o arquivo for criado, mas quando o Dropbox terminar de baixá-lo. Não sei exatamente como o Dropbox funciona. Se ele gravar no arquivo em seu lugar final, ouça os close_writeeventos. Se ele gravar no arquivo em um local temporário e depois movê-lo para o lugar, ouça os moved_toeventos. Passe as opções -m -qpara inotifywaitque ele continue ouvindo eventos (por padrão, aguarda apenas o próximo evento) e imprima apenas mensagens relevantes.

cd ~/Dropbox/myfolder
inotifywait -m -q -e close_write --format %f . | while IFS= read -r file; do
  cp -p "$file" /path/to/other/directory
done
Gilles 'SO- parar de ser mau'
fonte
1
Isso falha nos arquivos que incluem novas linhas em seus nomes. Não consegui encontrar uma maneira de gerar inotifywaitnomes de arquivos com terminação nula. O melhor que pude fazer foi usar um personagem menos provável que a nova linha, por exemplo %f$'\001', e usar -d $'\001'com while IFS= read -rou xargs.
Pausado até novo aviso.
1
@DennisWilliamson Sim, inotifywaité irritante assim. Você pode usar algo como //%f, pois o nome do arquivo nunca conterá uma barra dupla, contanto que o caminho a ser observado não; então o aborrecimento está do lado da análise.
Gilles 'SO- stop be evil'