Script para monitorar e mover pastas ou arquivos, windows

1,747 views
Skip to first unread message

Kenji Yasumitsu

unread,
Jul 16, 2014, 9:47:04 AM7/16/14
to mateh...@googlegroups.com
Bom dia pessoal, estou com uma certa dificuldade em criar um script para monitorar uma certa pasta em um servidor, ex. tenho que verificar quando uma nova versão de um produto está pronto no servidor para trazer para o meu pc e fazer o deploy.
Até agora procurei a solução de 2 formas, com autoIt ou com python, mas estou empacado. Pesquisei e o que eu consegui até agora foi como monitorar a pasta, mas não consigo copiar a pasta arquivo novo.
Até agora o q eu tenho é isso, alguém tem um script parecido ou pode me ajudar com esse código?

import os, time
pastaMonitorada = "."
antes = dict ([(f, None) for f in os.listdir (pastaMonitorada)])
while 1:
  time.sleep (10)
  depois= dict ([(f, None) for f in os.listdir (pastaMonitorada)])
  add = [f for f in antes if not f in depois]
  rem = [f for f in antes if not f in depois]
  if add: print "Add: ", ", ".join (add)
  if rem: print "Removeu: ", ", ".join (rem)
  antes = depois

Alan

unread,
Jul 16, 2014, 9:56:44 AM7/16/14
to mateh...@googlegroups.com
o sistema operacional geralmente levanta eventos quando ocorrem mudancas no file system , ou seja voce nao precisa ficar perguntando o tempo todo..

tem uns modulos em python que facilitam o trabalho de monitorar estes eventos.

da uma olhada ve se esse link aqui ajuda: http://brunorocha.org/python/watching-a-directory-for-file-changes-with-python.html

se não conseguir grita


--
Você recebeu essa mensagem porque está inscrito no grupo quot;matehackers" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para matehackers...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Mauricio de Abreu Antunes

unread,
Jul 16, 2014, 10:00:39 AM7/16/14
to mateh...@googlegroups.com
python watchdog. procura por isso. vai te livrar de muita dor de cabeça.

eu já usei ela pra verificar se arquivos de CSS mudavam. quando mudavam eu passava uma lib de compress neles. bem útil! :-)
--
Mauricio de Abreu Antunes

Kenji Yasumitsu

unread,
Jul 16, 2014, 10:00:57 AM7/16/14
to mateh...@googlegroups.com
então, o problema não tá sendo monitorar, e sim fazer uma ação com esse arquivo novo, ex.: o script achou um arquivo novo na pasta, assim ele pega esse arquivo novo e copia em outra pasta.

Alan

unread,
Jul 16, 2014, 10:03:52 AM7/16/14
to mateh...@googlegroups.com
o argumento de evento tem um atributo 'src_path' que voce pode usar para manipular o arquivo

Kenji Yasumitsu

unread,
Jul 16, 2014, 10:07:48 AM7/16/14
to mateh...@googlegroups.com
Verdade, dei uma olhada com mais atenção ali no wd, vou tentar algo como "minhaVar = src_path" e usa essa var pra dar um copy if change, algo assim

Mauricio de Abreu Antunes

unread,
Jul 16, 2014, 10:07:59 AM7/16/14
to mateh...@googlegroups.com
ok.
primeiro eu sugiro que tu cole um gist do teu script pq to meio perdido lendo ele. :(
feel free to: http://pastebin.com/
segundo, usando um watchdog da vida, metade do seu script vai embora e aí vamos lidar com o problema real.
o watchdog do que eu lembra retorna uma lista dos arquivos que modificaram. aí depois fica fácil :-)


Em 16 de julho de 2014 11:00, Kenji Yasumitsu <kenjiya...@gmail.com> escreveu:



--

Alan

unread,
Jul 16, 2014, 10:16:41 AM7/16/14
to mateh...@googlegroups.com
in before bash foo masters come here and do it with find and one line of code

Mauricio de Abreu Antunes

unread,
Jul 16, 2014, 10:54:48 AM7/16/14
to mateh...@googlegroups.com
verdade alan
mas como eu sou hipster da computação eu baixo 10438947384 bibliotecas e ainda preciso colocar warnings na codebase flw

Alan

unread,
Jul 16, 2014, 12:08:34 PM7/16/14
to mateh...@googlegroups.com
# copia o qualquer o arquivo cujo nome path é '/path/to/file' se ele foi alterado a menos de 5 minutos para a pasta /path/to/destination. executa a cada 5 minutos.
watch -n 300 'find --iwholename /path/to/file -mmin -5 -exec cp -v {} /path/to/destination'

Alô produção? O quê?

Er.. a produção ta me falando aqui que eu não sei nada de bash e esse comando provavelmente não funciona;

José Ricardo Borba

unread,
Jul 16, 2014, 12:25:37 PM7/16/14
to mateh...@googlegroups.com
Embora eu não goste (e não saiba quase nada de bash script) achei a solucão elegante.
Abraco,
José Ricardo Borba

Kenji Yasumitsu

unread,
Jul 16, 2014, 12:43:29 PM7/16/14
to mateh...@googlegroups.com
http://pastebin.com/cinv9yK5

o código q eu comecei não tava usando wd, eu tinha pensado em usar a w32 tbm, mas como eu falei antes, o meu problema não era monitorar, mas sim tomar uma ação depois, o máximo q eu consegui foi pega o nome do arquivo, mas não consegui jogar a modificação em outra pasta.

Kenji Yasumitsu

unread,
Jul 16, 2014, 12:44:54 PM7/16/14
to mateh...@googlegroups.com
não dá pra usar bash pq to no windows, não posso usar cyg tbm, é só python ou autoIt.

Mauricio Martins

unread,
Jul 31, 2014, 1:35:56 PM7/31/14
to mateh...@googlegroups.com
Olá, sou novo aqui e gosto de ler os foruns... eu usei isso uma vez mas utilizando PowerShell

Por exemplo:
# path do monitor
$searchPath="C:\TEMP"

# create a new file system watcher...
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = $searchPath
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true

# now register an event handler to $watcher object...
$changed = Register-ObjectEvent $watcher "Changed" -Action {
   write-host "Changed: $($eventArgs.FullPath)"
}

Para invocar este script, salve-o em um arquivo .ps1 (fswatch.ps1) e dentro do Windows PowerShell, simplesmente chame pelo nome do arquivo. Ele registrará o listener. Numa outra sessão de prompt. Crie um arquivo dentro do diretorio monitorado. Com um pouco de trabalho você poderá fazer as atividades de que necessita usando o exemplo acima como esqueleto.

Só fique atento pelo fato de que a notificação do evento, informa alterações no filesystem. Se o arquivo está completo e fechado, esse é um outro assunto.

Kenji Yasumitsu

unread,
Aug 4, 2014, 11:53:07 AM8/4/14
to mateh...@googlegroups.com
Eu fiz o watcher em python, o meu problema tá sendo em copiar e salvar os arquivos, mas acho q tá dando algum pau de permissão no windows.


Alan

unread,
Aug 4, 2014, 1:15:10 PM8/4/14
to mateh...@googlegroups.com
qual o problema que ta dando

Mauricio Martins

unread,
Aug 4, 2014, 1:28:31 PM8/4/14
to mateh...@googlegroups.com
Legal, esse e um problema comum em sistemas de transferencias de arquivos baseados dessa forma. Mas no Windows é simples de se resolver;
Sempre use para monitorar o filesystem, inclusive copiar/mover a mesma conta que o gerou ou com algum privilégio melhor. (Não recomendado, mas talvez um Full Control na pasta pode ajudar)
Outro peculiar é tentar copiar ou mover um arquivo ainda aberto. OS monitores de filesystems normalmente vai te dizer se o arquivo foi criado ou removido ou conteudo da pasta alterado. Mas ele nao sinaliza se arquivo ainda está em uso ou nao.

Eu particularmente monitoraria o folder esperando por uma marca. Por exemplo um arquivo que pudesse indicar ao monitor que os arquivos a serem transferidos estão prontos. Tem que ser um arquivo pequeno, de forma que possa ser criado e liberado instantaneamente. Uma vez que o arquivo de marca for criado, o programa monitor pode seguramente transferir os outros arquivos. E no final da transferencia, remover a marca.

Por outro lado, o programa que gera os arquivos a serem transferidos, só irá gerar mais arquivos se o diretório nao conter a marca.

Todavia, a dica, manda pra nós o erro que estás tendo no python... não programo em python, mas deve ter algo como errno() ferr() ou qualquer coisa que reporte os erros de sistema operacional... ou um stack trace com isso
Reply all
Reply to author
Forward
0 new messages