Você pode dizer se um arquivo foi renomeado?

Você pode dizer se um arquivo foi renomeado?

Muitas ferramentas disponíveis para sincronizar arquivos não são adequadas para sincronizar seu diretório inicial. Por isso, 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. Só de pensar no primeiro caso (se o usuário o renomear), existe uma maneira de saber que este não é um arquivo novo, mas um arquivo que foi renomeado? Talvez um ID exclusivo do arquivo que eu não conheço. Descritores de arquivos parecem algo a ser examinado, mas tenho certeza de que é um conceito diferente.

Responder1

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

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

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

Os descritores de arquivo 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, hora de modificação e número de inode de antes, mas com um nome diferente, isso 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 hora da modificação.

Todas as ferramentas que consigo pensar para renomear o arquivo de trilha fazem isso com base no conteúdo do arquivo.Uníssonodetecta arquivos renomeadosse pelo menos um dos endpoints for remoto. Alguns sistemas modernos de controle de versão, como o git, também detectam arquivos renomeados.

Eu suspeito fortemente que tudo o que você deseja fazer com a sincronização de arquivos, entresincronizar novamente,Uníssonoe controle de versão, ele já existe.

Responder2

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

Se o arquivo foi renomeado, o (s) inode (s) não mudará (s), você pode usá-lo, mas, a menos que as renomeações aconteçam com frequência, duvido que valha a pena.

informação relacionada