Eu baixo vários arquivos para uma pasta downloading
viaHTTPie. Um script bash visa processar arquivos baixados e tentei copiar os arquivos baixados para outra pasta como
find /folder/downloading -type f -exec mv '{}' /folder/downloaded \;
mas isso também copia os arquivos que ainda não foram finalizados. Tentei limitar a transferência para arquivos mais antigos adicionando -mmin +5
ao comando. Qual é o comando eficiente para deixar os arquivos sendo gravados e transferir apenas os arquivos baixados?
Responder1
Não é muito eficiente, mas você poderia fazer:
find /folder/downloading -type f -exec sh -c '
for file do
lsof -F a "$file" | grep -q w || mv "$file" /folder/downloaded
done' sh {} +
Isto é, verifique se o arquivo não está listado com um modo de acesso w
de rito a
no l
arquivo s
dos o
arquivos f
antes de m
desligá v
-lo.
A psmisc
implementação fuser
normalmente encontrada em sistemas operacionais baseados em Linux tem uma -w
função (verificar arquivos abertos para gravação), mas infelizmente só funciona -k
para encerrar os processos correspondentes. No entanto, parece que você ainda pode usá-lo usando o pseudosinal 0 que não faz nada:
find /folder/downloading -type f -exec sh -c '
for file do
fuser -s -w -k -0 "$file" || mv "$file" /folder/downloaded
done' sh {} +
Remova -s
(ou até mesmo substitua-o por -v
) se quiser ver quais processos estão impedindo a movimentação.
Observe que se você não estiver executando esses comandos como superusuário, você obterá apenas informações sobre seus processos. Se os processos de download dos arquivos estiverem sendo executados por um usuário diferente, eles permanecerão sem serem detectados.
Observe também que, a menos que você esteja movendo os arquivos para um sistema de arquivos diferente, mover os arquivos não impedirá que qualquer processo que esteja gravando no arquivo termine de gravá-lo.
No entanto, dependendo do que foram concebidos para fazer posteriormente, poderão ficar confusos se, depois de terminarem de escrever, o ficheiro já não estiver lá (por exemplo, se quiserem alterar alguns atributos do ficheiro depois de o descarregarem e o fizeremnãoatravés do descritor de arquivo (como chmod()
vs fchmod()
, ou utimes()
o que não pode ser feito através de um descritor de arquivo)).