Tenho um arquivo que desejo transferir do computador A para o computador B por meio de um disco rígido externo. Todos esses discos rígidos estão formatados em ext4. O arquivo está acessível (o que significa que pude lê-lo sem problemas) no computador A e no disco rígido externo.
Quando desejo sincronizar novamente o arquivo salvo no disco rígido externo para o computador B:
rsync: [receiver] mkstemp "/home/theuser/Documents/path/to/the/file_with_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_long_filename.pdf.LY2KGE" failed: File name too long (36)
Eu li na pergunta e no site a seguir que provavelmente está relacionado ao fato de que o comprimento máximo do nome de arquivo do sistema de arquivos ext4 é de 255 bytes
- Erro rsync "Nome do arquivo muito longo (36)" para nomes de arquivos com caracteres UTF-8
- https://winbuzzer.com/2021/06/30/filesystems-explained-whats-the-difference-between-fat32-ntfs-exfat-hfs-and-ext4-xcxwbt/
Aqui está a minha pergunta: se o arquivo está acessível no computador A e no disco rígido externo, o que implica que o nome do arquivo não é um problema, por que isso se torna um problema quando se tenta transferir o arquivo?
A palavra-chave aqui é que
mkstemp
você pode ver na mensagem de erro.( fonte )
A mensagem também contém a string
file_with_very_…_very_long_filename.pdf.LY2KGE
. Acho que foi isso que aconteceu:file_with_very_…_very_long_filename.pdf
. Não é muito longo, mas está perto do limite.rsync
usou o nome original para criar um modelo paramkstemp()
. O modelo erafile_with_very_…_very_long_filename.pdf.XXXXXX
.mkstemp()
tentei criar um arquivo com o nomefile_with_very_…_very_long_filename.pdf.LY2KGE
. Este nome é obviamente mais longo que o nome original. É esse nome que foi muito longo e causou o fracasso.Aparentemente, se tudo corresse bem,
rsync
acabaria por renomear o arquivo para o nome original.Não sei muito sobre como
rsync
funciona nos bastidores, neste parágrafo estou dando um palpite. É muito provável quersync
use nomes temporários durante as transferências para criar (ou substituir) arquivos de destino de forma atômica cada um. Esta é uma boa prática conhecida. Imaginesomefile
que está prestes a ser criado (ou sobrescrito) e o tamanho final não é trivialmente pequeno. Sersync
estivesse gravandosomefile
diretamente, haveria uma janela de tempo em que o arquivo estaria incompleto (ou incoerente). Preparar um novo arquivo completo com um nome temporário (por exemplo,somefile.U3RJV7
ou apenasU3RJV7
) e depois movê-lo para o nome de destino dentro do mesmo sistema de arquivos resolve isso: não há nada (ou a versão antiga) e de repente um arquivo completo (ou completamente atualizado) aparece comosomefile
.Se o destinatário
rsync
usasse um modelo razoavelmente curto e de comprimento fixo, não haveria problema. Ele usou o modelo por mais tempo que o nome do destino, daí o problema. Isso pode ser considerado um bug.Dei uma olhada
man 1 rsync
e não encontrei opções para ajustar o comportamento do buggy. Por enquanto, parece-me que você precisa usar um nome de arquivo mais curto se quiserrsync
transferir o arquivo. Deve ser possível renomear o arquivo (em ambas as extremidades) após a transferência.