Operações de árvore (localizar) usando índices (números de inodes) para endereçar arquivos / diretórios

1

(removido menção do SO, já que eu preciso da solução 'general Unix / Linux')

Tarefa: executar operação sobre arquivos / diretórios, em "encontrar caminho", mas assumindo que nomes de caminho de arquivos / diretórios podem ser alterados no processo.

Um problema típico com o 'find' é quando algo é renomeado, encontrar tentativas de informar a entidade e relatar que não é possível encontrá-la. Se operasse com índices, tal problema não existiria (a um custo de pesquisa reversa, inode - > nome de caminho e talvez correspondência de nome adicional).

No momento, eu obtenho uma lista de diretórios / arquivos de assunto, obtenho seus índices e uso algo como 'find path -inum index' para obter o nome atual para executar a operação sobre o arquivo. O script parece um pouco desajeitado por causa disso.

Existe uma maneira mais elegante, talvez haja um clone de 'find' capaz de operar com índices também, em vez de usar nomes de caminho em cache?

    
por Konstantin Boyandin 17.01.2017 / 09:31

1 resposta

0

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.
por 18.01.2017 / 01:27