Sabe dizer se um arquivo foi renomeado?

3

Muitas ferramentas para sincronização de arquivos não estão corretas para sincronizar seu diretório inicial. Por causa disso, e para aprender Ruby, tenho trabalhado em minha própria ferramenta de sincronização.

Um problema que encontrei, que acho que está nas minhas ferramentas de sincronização, é o que acontece quando o usuário renomeia um arquivo ou exclui um arquivo. Apenas pensando no primeiro caso (se o usuário o renomeia) existe uma maneira que eu possa dizer que este não é um novo arquivo, mas um arquivo que foi renomeado? Talvez um ID único do arquivo que eu não conheça. Os descritores de arquivos soam como algo para examinar, mas tenho certeza de que esse é um conceito diferente.

    
por rangeme 20.06.2016 / 23:41

2 respostas

3

Não há como saber com certeza se um arquivo foi renomeado.

Quando um arquivo é renomeado, seu número inode não é alterado. (Isso pode não ser verdade para sistemas de arquivos "exóticos", como sistemas de arquivos de rede, mas é verdadeiro para todos os sistemas de arquivos Unix "nativos".) No entanto, o inverso não é verdadeiro: se um arquivo for excluído, um novo arquivo pode ser criado com o arquivo. mesmo número de inode. Assim, mesmo que você veja que um arquivo tem o mesmo número de inode que outro arquivo tinha antes, isso não implica necessariamente que o arquivo foi renomeado.

O número de inode identifica exclusivamente o arquivo enquanto existir . Isso o torna adequado para detectar links físicos, mas não para detectar renomeações.

Os descritores de arquivos estão associados a um processo específico e são inúteis aqui.

Você pode considerar uma heurística de que, se um arquivo tiver o mesmo tamanho, tempo de modificação e número de inode de antes, mas um nome diferente, significa que ele foi renomeado. Essa heurística é semelhante ao que muitas ferramentas de sincronização fazem para detectar arquivos inalterados: mesmo nome, tamanho e tempo de modificação.

Todas as ferramentas que posso imaginar para renomear o arquivo de trilha são baseadas no conteúdo do arquivo. Unison detecta arquivos renomeados se pelo menos um dos endpoints for remoto . Alguns sistemas modernos de controle de versão, como o git, também detectam arquivos renomeados.

Suspeito que o que você deseja fazer com a sincronização de arquivos, entre rsync , Unison e controle de versão, ele já existe.

    
por 21.06.2016 / 01:29
0

Os descritores de arquivo são criados para um programa quando ele abre um arquivo e só é válido até que o programa o feche novamente. Então, assim como você suspeitava: um conceito diferente.

Se o arquivo acabou de ser renomeado, o (s) inodo (s) não será (ão) alterado (s), você pode usar isso, mas a menos que renomeações aconteçam frequentemente, duvido que valha a pena.

    
por 20.06.2016 / 23:50