Como detectar novos arquivos em uma pasta com um script bash ? Gostaria de processar os arquivos assim que eles forem criados na pasta. Isso é possível ou preciso agendar um script com cron que verifique se há novos arquivos a cada minuto ou mais?
shell
filesystems
files
directory
monitoring
ihatetoregister
fonte
fonte
Respostas:
Você deve considerar o uso
inotifywait
, como exemplo:No Ubuntu
inotifywait
é fornecido peloinotify-tools
pacote. A partir da versão 3.13 (atual no Ubuntu 12.04)inotifywait
incluirá o nome do arquivo sem a opção -f. Versões mais antigas podem precisar ser coagidas. O que é importante observar é que a-e
opçãoinotifywait
é a melhor maneira de fazer a filtragem de eventos. Além disso, seuread
comando pode atribuir a saída posicional em várias variáveis que você pode optar por usar ou ignorar. Não há necessidade de usar grep / sed / awk para pré-processar a saída.fonte
inotifywait
era exatamente o que eu queria.The '--filename' option no longer exists. The option it enabled in earlier versions of inotifywait is now turned on by default.
Então, você só precisa fazerinotifywait -m /path -e create |
isso, vou tentar editar esta resposta.fswatch
. Eu não escrevi, mas é de código aberto e eu o uso.Eu prefiro
incron
, pois é mais fácil de gerenciar. Essencialmente, é um serviço que aproveitainotify
e você pode definir configurações para executar ações com base nas operações de alteração de arquivo.Ex:
Você pode ver um exemplo completo aqui: http://www.cyberciti.biz/faq/linux-inotify-examples-to-replicate-directories/
fonte
Acabei de preparar isso e não vejo grandes problemas com isso, além de uma pequena chance de perder arquivos entre as verificações.
Se o processamento do arquivo não demorar muito, você não deve perder nenhum novo arquivo. Você também pode ter as atividades em segundo plano ... Não é à prova de balas, mas serve a alguns propósitos sem ferramentas externas, como inotify.
fonte
inotify
não estiver disponível. Eu adicionaria-type f
para filtrar apenas os arquivos. Caso contrário, a pasta também será retornada.-f filename
opção é ótima. Portanto, a única questão restante é como fazer isso iniciar na reinicialização. Vou usar isso com minha planta solar paraos.system("ssh me@mysystem ' ( touch /home/me/alarms/low24 ) '")
que a criação desse arquivo faça com que o computador mestre useespeak
e anuncie a baixa tensão. Ele já me envia um e-mail, mas como meu sistema já fala as horas no início da hora, ele tem todo o resto. askubuntu.com/questions/977613/...Você pode usar
watch
no seu scriptMonitora sua pasta e lista tudo a cada 0,1 segundos
Recua
Não é em tempo real; portanto, se um arquivo foi criado e excluído em menos de 0,1 segundo, isso não funcionaria,
watch
apenas suportaria no mínimo 0,1 segundo.fonte
Estou assumindo que a pasta de destino (vou chamá-la
isempty
apenas por conveniência) está vazia e você está esperando um ou mais arquivos serem descartados lá.Você pode usar o seguinte comando:
apenas para verificar se a pasta ainda está vazia, na verdade retornará um 0 se não houver um novo arquivo (portanto, a
isempty
pasta ainda está vazia) ou, por outro lado, retornará um valor maior que 0 (na verdade, o número de arquivos atualmente na pasta).Dito isso, um teste tolo de se / então pode fazer o resto do trabalho:
Obviamente, a
do_something
função terá que manipular o (s) arquivo (s) dentro daisempty
pasta e removê-lo (s) da própria pasta após o processamento.Adicionar uma linha como a seguinte no seu crontab executará a verificação uma vez por minuto e acionará a
do_something
ação se a pasta não estiver vazia, é claro:fonte
ls
para scripts. Usefind
ou globbing simples: mywiki.wooledge.org/ParsingLsSe você deseja detectar novos arquivos, processe-os e, no final, exclua os arquivos prosseguidos, você pode usar systemd.path . Este método baseia-se em inotify. Há uma opção DirectoryNotEmpty, para que o systemd possa executar seu script sempre que detectar qualquer arquivo no diretório. Você deve se lembrar que ele funcionará apenas se você puder excluir os arquivos prosseguidos e o script deixar o diretório vazio.
Primeiro prepare o arquivo mymonitor.service
Em seguida, vá para mymonitor.path para definir o caminho
Se o nome do arquivo .path for o mesmo que o nome do serviço, não será necessário especificar o nome do serviço no arquivo .path.
Baseia-se no monitoramento de acesso a arquivos para manequins
fonte
entr
Usar
entr
é a nova maneira de fazer isso (é multiplataforma). A notaentr
não usa sondagem, o que oferece uma enorme vantagem sobre muitas das alternativas.No BSD, ele usa
pledge(2)
Você pode instalá-lo com
Você pode rastrear um diretório para novas adições usando
Opções explicadas (nos documentos),
fonte
O Bash não pode fazer isso facilmente. Você precisaria basicamente obter uma lista de todos os arquivos na pasta e periodicamente obter uma nova lista e compará-los para ver o que mudou.
O que você está procurando é chamado inotify. Ele está embutido no kernel do linux e você pode basicamente ficar sentado esperando que algo aconteça. Nesse momento, o inotify volta e diz 'ei, existe um novo arquivo chamado foobar'
Para realizar o que você deseja, você teria que mudar para algo como perl e usar Linux :: Inotify2 (o python provavelmente também suporta inotify, mas eu sou uma pessoa perl).
fonte
Isso funciona no cygwin e Linux. Algumas das soluções anteriores que escrevem um arquivo farão com que o disco seja danificado. Este scipt não tem esse problema:
fonte
Abaixo está uma versão resumida do exemplo no stackoverflow que eu testei e incorporei em um dos meus projetos que requer monitoramento de diretórios específicos.
Aqui está um link para um script que usa uma versão modificada acima para descriptografar automaticamente arquivos ou diretórios encontrados em seu ponto de montagem sshfs; o projeto mencionado acima.
fonte