Não é muito eficiente, mas você pode 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 {} +
Isso é verificar que o arquivo não está listado com um w
rito a
modo cesso no l
i s
t de o
caneta f
iles antes de m
o v
ING.
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 ela só funciona -k
para eliminar os processos correspondentes. No entanto, parece que você ainda pode usá-lo usando o pseudo-sinal 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 o -s
(ou mesmo substitua-o -v
) se desejar ver quais processos estão impedindo a movimentação.
Observe que, se você não estiver executando esses comandos como superusuário, receberá apenas informações sobre seus processos. Se os processos de download dos arquivos estiverem sendo executados como um usuário diferente, eles permanecerão não detectados.
Observe também que, a menos que você esteja movendo os arquivos para um sistema de arquivos diferente, a movimentação dos arquivos não impedirá que qualquer processo que esteja gravando atualmente no arquivo termine de gravá-lo.
No entanto, dependendo do que eles foram projetados para fazer depois, eles podem ser confundidos se, depois de terminar de escrever, o arquivo não está lá (por exemplo, se eles querem mudar alguns atributos do arquivo depois de baixá-lo e fazê-lo não através do descritor de arquivo (como chmod()
vs fchmod()
, ou utimes()
que não pode ser feito por meio de um descritor de arquivo)).
%.part
renomear para%). Então, se o downloader for bem comportado (não faz mais nada estranho), você poderá renomear osmv
arquivos ( ).