Eu faço o download de vários arquivos em uma pasta downloading
via HTTPie . Um script bash tem como objetivo 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 que estão sendo gravados e transferir apenas os arquivos baixados?
%.part
renomear para%). Então, se o downloader for bem comportado (não faz mais nada estranho), você poderá renomear osmv
arquivos ( ).Respostas:
Não é muito eficiente, mas você pode fazer:
Isso é verificar que o arquivo não está listado com um
w
ritoa
modo cesso nol
is
t deo
canetaf
iles antes dem
ov
ING.A
psmisc
implementaçãofuser
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: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()
vsfchmod()
, ouutimes()
que não pode ser feito por meio de um descritor de arquivo)).fonte
-exec
está sendo executadosh
com um comando (-c '...'
) e{} +
diz para colocar mais de um resultado nesse comando por vez. O que não entendo é por que há outrosh
após o comando. o que estou perdendo?$0
. Ou seja, atribui um nome a esse script embutido. Esse nome pode ser usado em mensagens de erro como,<name>: fuser: command not found
por exemplo,sh
geralmente é uma boa opção nesse caso para deixar claro o que está relatando essa mensagem de erro (também é o que seria se não apresentássemos nenhum argumento depois do script embutido).