Passando arquivos em um diretório através de um filtro para outro diretório

1

Eu tenho um diretório cheio de arquivos.

Eu quero passar inicialmente cada um desses arquivos por um comando e enviar a saída para outro arquivo em um diretório diferente, como segue:

cat dir1/sourcefile | process.py > dir2/destfile

o nome de "destfile" não é importante, pode ser qualquer nome de arquivo.

Fácil, no entanto - novos arquivos estão sendo adicionados a dir1 o tempo todo, e os arquivos existentes estão sendo modificados ocasionalmente.

Como posso escrever um script bash (ou outro tipo de script) que irá manter um olho em dir1, e sempre que um novo arquivo for adicionado ou modificado, processá-lo ou reprocessá-lo em dir2?

    
por sanity 05.09.2009 / 00:43

3 respostas

1

com um pouco de magia do Google, encontrado este

você não especifica qual sistema operacional ou distribuição está usando, mas no Ubuntu, o pacote inotify-tools contém inotifywait e inotifywatch:

inotifywait - wait for changes to files using inotify
inotifywatch - gather filesystem access statistics using inotify

então, para o seu uso, você gostaria de algo mais como:

#!/bin/sh
while inotifywait -e modify /dir1; do
for i in 'ls -1 /dir1'
do process.py /dir1/$i > /dir2/$i.processed; done
done

(desculpe, meu bash fu está fraco hoje à noite)

Se você não estiver criando arquivos rapidamente, provavelmente poderá aparar o loop interno ...

    
por 15.09.2009 / 03:59
0

No linux você pode usar o inotify para fazer com que os eventos de um diretório sejam alterados ou um arquivo seja alterado. Infelizmente, não há nenhum utilitário de linha de comando que possa suportar isso para scripts bash ... pelo menos nenhum que eu saiba.

No entanto, há uma ligação do Python para a API inotify, PyInotify . Já que você já está usando python, para o seu utilitário de processamento, talvez isso seja adequado para você.

    
por 05.09.2009 / 00:54
0

Como o KFro sugeriu, a maneira mais elegante seria com o PyInotify.

Mas uma maneira bruta de fazer isso seria escrever um script Python que use os.walk para visitar todos os arquivos e acompanhar quais arquivos já foram vistos em um dicionário; em seguida, durma um pouco usando time.sleep () e execute o os.walk novamente, vendo quais arquivos ainda não estavam no dicionário e atualizando apropriadamente.

Para acompanhar os arquivos que foram atualizados, você pode usar os.stat () para obter um registro de data e hora de quando o arquivo foi atualizado pela última vez e armazená-lo no dicionário. Na verdade, isso é tudo o que você realmente precisa no dicionário: o nome completo do arquivo (incluindo o caminho) como chave e o registro de data e hora como valor.

Não é tão elegante quanto o PyInotify, mas deve funcionar em qualquer lugar em que o Python funcione.

    
por 05.09.2009 / 02:15

Tags