Quel est l'intérêt de ls -f (ou pourquoi est-ce suspendu?)

9

J'ai un répertoire contenant environ 100 000 fichiers. ls -f se bloque pendant plus d'une minute. J'ai couru strace et j'ai immédiatement commencé à voir getdents, donc ls lit clairement le répertoire. Je vois également beaucoup d'appels à brk, donc ls met clairement les choses en mémoire. J'ai écrit un programme simple qui appelle readdir et génère des noms de fichiers, et il répond immédiatement. Mais ls -f ne fournit pas de sortie. Ce qui donne? Je pensais que tout l'intérêt de -f est que ls ne fait rien de plus que readdir. Existe-t-il un moyen portable et fiable de répertorier le contenu d'un répertoire? (Remarque, ceci est ls des coreutils de gnu sur Linux.)

-ÉDITER-

Il y avait un alias en place, mais "/ bin / ls -1f> / dev / null" prend 8 à 15 secondes, "/ bin / ls -1fx> / dev / null" prend 4 à 11 secondes, mais un programme simple cela ne fait que readdir prend 0,011 seconde. Que dois-je faire pour que les gnous ne sucent pas?

William Pursell
la source

Réponses:

7

Le but -fest d'essayer et d'éviter la nécessité de stat chaque entrée de fichier, et d'éviter la nécessité de les lire tous avant qu'ils soient affichés. Il s'agit d'une option "méta" qui désactive simplement les autres options.

Donc, oui, il devrait faire ce que vous attendez. Je ne peux pas expliquer pourquoi ce n'est pas le cas, mais je suppose que vous pourriez avoir un alias de shell ou quelque chose d'autre qui insère des options supplémentaires à la commande. Cela pourrait réactiver une fonctionnalité plutôt que la -fdésactiver, et être considéré comme "plus spécifique", donc prenez la priorité.

Daniel Pittman
la source
2
Argghh. ls () {/ bin / ls -FB $ @; } Scripts de démarrage stupides.
William Pursell
1
hmm. J'ai désactivé la fonction et je vois toujours le même comportement même lorsque j'exécute / bin / ls.
William Pursell
Faites / bin / ls -f -1 (c'est moins un, pas moins-ell). Le / bin / ls sur une boîte RHEL J'utilise des noms de fichiers de formats dans les colonnes pour une raison quelconque.
Bruce Ediger
0

Une optimisation a été ajoutée dans coreutils 7.0 (commit 8d974b00fbbc2025de63e1e6d54827648fefa1c4):

2008-08-01  Kamil Dudka  <[email protected]>
    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 première explication qui me vient à l'esprit est que vous utilisez une ancienne version de coreutils. Vous devez mettre à niveau.

Gilles 'SO- arrête d'être méchant'
la source