Como copiar todos os arquivos de uma pasta excluindo os arquivos que estão sendo gravados?

Como copiar todos os arquivos de uma pasta excluindo os arquivos que estão sendo gravados?

Eu baixo vários arquivos para uma pasta downloadingviaHTTPie. 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 +5ao 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 wde rito ano larquivo sdos oarquivos fantes de mdesligá v-lo.

A psmiscimplementação fusernormalmente encontrada em sistemas operacionais baseados em Linux tem uma -wfunção (verificar arquivos abertos para gravação), mas infelizmente só funciona -kpara 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)).

informação relacionada