Qual è il punto di ls -f (o, perché è sospeso?)


9

Ho una directory con circa 100.000 file al suo interno. ls -f si blocca per oltre un minuto. Ho corso strace e ho subito iniziato a vedere getdents, quindi sta leggendo chiaramente la directory. Vedo anche molte chiamate a vantarsi, quindi è chiaramente buffering cose in memoria. Ho scritto un semplice programma che chiama readdir e genera nomi di file e risponde immediatamente. Ma ls -f non fornisce output. Cosa dà? Ho pensato che il punto di -f è che non fa altro che readdir. Esiste un modo portatile e affidabile per elencare il contenuto di una directory? (Nota, questo è ls dai coreutils di GNU su Linux.)

-MODIFICARE-

Era presente un alias, ma "/ bin / ls -1f> / dev / null" richiede da 8 a 15 secondi, "/ bin / ls -1fx> / dev / null" richiede da 4 a 11 secondi, ma un semplice programma che fa readdir richiede 0,011 secondi. Cosa devo fare per fare in modo che non faccia schifo?

Risposte:


7

Il punto -fè cercare di evitare la necessità di stat ogni voce del file, ed evitare la necessità di leggerli tutti prima che vengano visualizzati. È un'opzione "meta" che disabilita solo altre opzioni.

Quindi sì, dovrebbe fare quello che ti aspetti. Non posso rispondere perché non lo è, ma immagino che potresti avere un alias di shell o qualcos'altro che inserisce opzioni aggiuntive al comando. Ciò potrebbe riattivare una funzione rispetto a quella -fdisabilitata ed essere considerato "più specifico", quindi avere la precedenza.


2
Argghh. ls () {/ bin / ls -FB $ @; } Stupidi script di avvio.
William Pursell,

1
hmm. Disattivo la funzione e vedo ancora lo stesso comportamento anche quando eseguo / bin / ls.
William Pursell,

Fai / bin / ls -f -1 (che è meno-uno, non meno-ell). Il / bin / ls su una casella RHEL sto usando formati file nomi in colonne per qualche motivo.
Bruce Ediger,

0

Un'ottimizzazione è stata aggiunta in coreutils 7.0 (commit 8d974b00fbbc2025de63e1e6d54827648fefa1c4):

2008-08-01  Kamil Dudka  <kdudka@redhat.com>
    ls -U1 now uses constant memory
    When printing one name per line and not sorting, ls now uses
    constant memory per directory, no matter how many files are in
    the directory.
    * ls.c (print_dir): Print each file name immediately, when possible.
    * NEWS: Mention the improvement.

La prima spiegazione che mi viene in mente è che stai eseguendo una versione precedente di coreutils. Devi aggiornare.

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.