No contexto, inferimos que quando você escreve “índices”, na verdade você quer dizer inodes . No caso de você significar índices, observe que um diretório não consiste em uma lista de arquivos em uma ordem bem definida na qual você pode dizer "Eu quero o arquivo no índice 3". Os diretórios são indexados por nomes: você diz "Eu quero o arquivo chamado foo
". A ordem dos arquivos em um diretório pode mudar a qualquer momento.
Supondo que você quer dizer inodes, não há como acessar um arquivo por seu inode. Isso ocorre por design: caminhos de arquivo são como as permissões são aplicadas. Acessar um arquivo por seu inode ignoraria todas as verificações de permissão no diretório que o contém. Também seria possível apenas em sistemas de arquivos que tenham um conceito de inode by design, em vez de extrair números de inodes do ar apenas porque a API exige isso. Então, se você conhece apenas o inode de um arquivo, procurá-lo até encontrar um nome é a única maneira de operá-lo.
Mesmo se houvesse uma maneira de encontrar um arquivo por inode, isso não resolveria seu problema, apenas o moveria um pouco. Isso tornaria transparente quando um arquivo for renomeado após find
ter encontrado e antes de fazer alguma coisa com ele. No entanto, se o arquivo tiver sido excluído e outro arquivo tiver sido criado com o mesmo inode, find
acessará o arquivo errado.
Não há como uma API de arquivo obter um instantâneo atômico de uma árvore de diretórios. Existem várias soluções para o seu problema; qual (is) trabalho (s) pode (m) trabalhar para você depende do seu cenário de uso.
- Certifique-se de que sua tarefa lide com as modificações da árvore em que está operando.
- Verifique se todos os aplicativos que modificam a árvore de diretórios estão pausados enquanto sua tarefa está em execução.
- Use uma API de nível inferior para tirar um instantâneo e operar no instantâneo (somente leitura). Alguns sistemas de arquivos, como zfs e btrfs, podem fazê-lo, assim como tipos de volumes como o LVM.