Qual è l '"ordine di directory" dei file in una directory (usata da `ls -U`)?


19

Secondo la pagina man di ls, ls -Usignifica:

non ordinare; elenca le voci in ordine di directory.

Cosa significa "ordine di directory" e come viene determinato?

Il seguente test (eseguito su un file system ext3), mostra che non è l'ordine in cui sono stati creati i file:

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

Risposte:


14

Dipende dal filesystem. Per alcuni filesystem (ext3 tra questi), una directory è in realtà un file con un formato ben noto e il bit 'd' impostato nelle sue autorizzazioni o modalità. In tal caso, la storia della lunghezza dei nomi dei file che sono stati creati ed eliminati può essere importante. Il kernel inserirà la prima voce nel file di directory che ha spazio sufficiente per contenere il nome del nuovo file. Vedi http://e2fsprogs.sourceforge.net/ext2intro.html per maggiori dettagli, la sezione intitolata "Descrizione fisica".

Per alcuni altri filesystem, tra cui Reiserfs, una directory è in realtà solo alcune voci in un albero B + che non è visibile nel filesystem, quindi una semplice lsdirectory di un file system Reiserfs è in ordine lessicale.


@Bruce: Allora, quali sono esattamente i contenuti di questo file "directory"?
Faheem Mitha,

Tradizionalmente, qualcosa di molto simile a struct dirent, che trovo definito in /usr/include/bits/dirent.h su una scatola RHEL e su una scatola Slackware 11.0. Entrambe queste macchine si rifiutano di aprire direttamente una directory (). So che ero solito fare cose come "cat.> Dot.as.file" per convertire una directory in un file normale, l'ultima volta che l'ho fatto di sicuro è stato Solaris 8, credo. Fondamentalmente, struct dirent contiene un inode (un numero), una lunghezza del record, una lunghezza del nome e una stringa, che, come ricordo, può essere o meno terminata con ASCII-Nul.
Bruce Ediger,

@Bruce: Ok. E questa struttura C riesce a ottenere tutte le informazioni sui file e le sottodirectory che contiene in quei campi?
Faheem Mitha,

Una directory in filesystem come ext2, o BSD FFS o il filesystem Unix originale, conteneva appena un elenco di numeri di inode e nomi di file corrispondenti. Invocare "ls" senza argomenti ti ha appena guadagnato un elenco di nomi di file. Se avessi fatto "ls -l", "ls" avrebbe cercato ogni nome di file eseguendo una chiamata di sistema stat (2) sul nome del file e dalla stat struct, ottenendo autorizzazioni, dimensioni, "tipo di file", ecc. Quindi, no, un file di directory non ha tutte le informazioni, solo un elenco di nomi.
Bruce Ediger,

2
ext2.sourceforge.net/2005-ols/paper-html/node3.html spiega che la funzione dir_index include il nome del file e un segreto specifico del file system. dump2efs include dir_index nella sua linea di caratteristiche del filesystem se la funzione è abilitata.
Martin Dorey,

3

In effetti, non esiste un ordine specifico da aspettarsi. Sta al sistema operativo e all'implementazione del file system ordinare le voci nel modo che preferisce. Un obiettivo di questa opzione è quello di ottenere l'elenco più veloce possibile che può essere un fattore significativo con directory molto grandi.


Esistono algoritmi di scheduling / caching nei driver del kernel e del filesystem che influenzano quando i dati vengono scritti esattamente sul disco. Questo viene fatto per aumentare le prestazioni. A causa di questa ottimizzazione non si può davvero dire esattamente quando accadranno le scritture. Inoltre, i vecchi inode nei filesystem potrebbero essere riutilizzati in modo che i nuovi file possano apparire negli slot delle directory in cui si trovavano i vecchi file. Quindi l'ordine di creazione non è necessario "ordine di directory".
LawrenceC,

@ultrasawblade: Non sono sicuro del motivo per cui l'hai scritto come commento alla mia risposta anziché come risposta da sola o altro.
jlliagre,

@ultrasawblade: A rigor di termini, "vecchi inode [essere] riutilizzati" non ha nulla a che fare con il riutilizzo dei vecchi slot di directory. Questo può accadere ogni volta che le vecchie voci della directory non sono collegate; se sono tutti collegamenti reali, non è necessario che gli inode vengano deallocati.
G-Man dice "Reinstate Monica"

2

È l'ordine in cui le voci sono memorizzate internamente nel filesystem. Questo varierà da filesystem a filesystem. Ad esempio, gli entires possono essere memorizzati in una specie di albero bilanciato, come un albero rosso-nero . Potrebbero esserci ulteriori ottimizzazioni per le directory con un numero limitato di voci o per gestire in modo efficiente aggiunte e rimozioni.


-1

Directory è solo un altro file, che elenca i metadati dei file effettivi. "ls -U" elenca gli entires nello stesso ordine nel file di directory.

L'ordine è determinato dal sistema operativo e dall'implementazione del filesystem.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.