Qual é a "ordem do diretório" dos arquivos em um diretório (usado por `ls -U`)?

19

De acordo com a página do manual para ls, ls -Usignifica:

não classifique; listar as entradas em ordem de diretório.

O que significa "ordem de diretório" e como é determinada?

O teste a seguir (executado em um sistema de arquivos ext3) mostra que não é a ordem na qual os arquivos foram criados:

root@sv1010vm0007:/tmp# mkdir test
root@sv1010vm0007:/tmp# touch test/2
root@sv1010vm0007:/tmp# touch test/1
root@sv1010vm0007:/tmp# touch test/3
root@sv1010vm0007:/tmp# ls -U test
2  3  1
Stefan
fonte

Respostas:

14

Depende do sistema de arquivos. Para alguns sistemas de arquivos (ext3 entre eles), um diretório é na verdade um arquivo com um formato conhecido e o bit 'd' definido em suas permissões ou modo. Nesse caso, o histórico de quanto comprimento os nomes de arquivos foram criados e excluídos pode ter importância. O kernel preencherá a primeira entrada no arquivo de diretório que possui espaço suficiente para armazenar o nome do novo arquivo. Consulte http://e2fsprogs.sourceforge.net/ext2intro.html para obter mais detalhes, na seção intitulada "Descrição física".

Para alguns outros sistemas de arquivos, entre eles o Reiserfs, um diretório é na verdade apenas algumas entradas em uma árvore B + que não são visíveis no sistema de arquivos; portanto, lsum diretório simples em um sistema de arquivos Reiserfs está em ordem lexical.

Bruce Ediger
fonte
@ Bruce: Então, qual é o conteúdo desse arquivo "diretório" exatamente?
Faheem Mitha
Tradicionalmente, algo parecido com struct dirent, que eu acho definido em /usr/include/bits/dirent.h em uma caixa RHEL e em uma caixa Slackware 11.0. Ambas as máquinas se recusam a abrir () um diretório diretamente. Eu sei que costumava fazer coisas como "cat.> Dot.as.file" para converter um diretório em um arquivo regular, acho que a última vez que fiz isso com certeza foi o Solaris 8. Basicamente, struct dirent contém um inode (um número), um comprimento de registro, um comprimento de nome e uma sequência de caracteres que, se bem me lembro, pode ou não ser terminada em ASCII-Nul.
Bruce Ediger
@Bruce: Ok. E essa estrutura C consegue obter todas as informações sobre os arquivos e subdiretórios que contém nesses campos?
Faheem Mitha
Um diretório em sistemas de arquivos como ext2, ou BSD FFS ou o sistema de arquivos Unix original, continha apenas uma lista de números de inodes e nomes de arquivos correspondentes. Invocar "ls" sem argumentos acabou de ganhar uma lista de nomes de arquivos. Se você fez "ls -l", o "ls" pesquisaria cada nome de arquivo fazendo uma chamada de sistema stat (2) no nome do arquivo e, a partir da estrutura stat, obtenha permissões, tamanho, "tipo de arquivo", etc. Portanto, não, um arquivo de diretório não possui todas as informações, apenas uma lista de nomes.
Bruce Ediger
2
ext2.sourceforge.net/2005-ols/paper-html/node3.html explica que o recurso dir_index faz hash no nome do arquivo e em um segredo específico do sistema de arquivos. O dump2efs inclui dir_index em sua linha de recursos do sistema de arquivos, se o recurso estiver ativado.
Martin Dorey 13/03
3

De fato, não há uma ordem específica a esperar. Cabe à implementação do sistema operacional e do sistema de arquivos ordenar as entradas da maneira que desejar. Um objetivo dessa opção é obter a listagem mais rápida possível, o que pode ser um fator significativo em diretórios muito grandes.

jlliagre
fonte
Existem algoritmos de agendamento / armazenamento em cache nos drivers do kernel e do sistema de arquivos que influenciam quando exatamente os dados são gravados no disco. Isso é feito para aumentar o desempenho. Devido a essa otimização, você não pode realmente dizer exatamente quando as gravações acontecerão. Além disso, inodes antigos em sistemas de arquivos podem ser reutilizados para que novos arquivos possam aparecer nos slots de diretório onde estavam os arquivos antigos. Portanto, a ordem de criação não é necessária "ordem do diretório".
LawrenceC
@ultrasawblade: Não sei por que você escreveu isso como um comentário à minha própria resposta, em vez de uma resposta por si só ou o que seja.
Jlliagre
@ultrasawblade: Estritamente falando, "inodes antigos [sendo] reutilizados" não tem nada a ver com a reutilização de slots de diretório antigos. Isso pode acontecer sempre que as entradas antigas do diretório forem desvinculadas; se todos eles são links físicos, isso não precisa resultar na desalocação de inodes.
G-Man diz 'Reinstate Monica'
2

É a ordem em que as entradas são armazenadas internamente no sistema de arquivos. Isso irá variar de sistema de arquivos para sistema de arquivos. Por exemplo, as entradas podem ser armazenadas em algum tipo de árvore balanceada, como uma Árvore Vermelho-Preta . Pode haver otimizações adicionais para diretórios com um pequeno número de entradas ou para lidar eficientemente com adições e remoções.

KeithB
fonte
-1

O diretório é apenas outro arquivo, que lista os metadados dos arquivos reais. "ls -U" apenas lista as entradas na mesma ordem no arquivo de diretório.

A ordem é determinada pelo sistema operacional e pela implementação do sistema de arquivos.

rajaganesh87
fonte