Qual é o objetivo de ls -f (ou, por que isso está suspenso?)

9

Eu tenho um diretório com cerca de 100.000 arquivos. ls -f trava por mais de um minuto. Corri strace, e imediatamente comecei a ver getdents, então ls está claramente lendo o diretório. Também vejo muitas chamadas para brk, então ls está claramente protegendo as coisas na memória. Eu escrevi um programa simples que chama readdir e gera nomes de arquivos, e ele responde imediatamente. Mas ls -f não fornece saída. O que da? Eu pensei que o ponto principal de -f é que ele faz com que o ls não faça nada além de readdir. Existe uma maneira portátil e confiável de listar o conteúdo de um diretório? (Note, isto é sl dos coreutils do gnu no Linux.)

-EDITAR-

Havia um alias no lugar, mas "/ bin / ls -1f> / dev / null" leva de 8 a 15 segundos, "/ bin / ls -1fx> / dev / null" leva de 4 a 11 segundos, mas um programa simples isso apenas readdir leva 0,011 segundos. O que preciso fazer para que os gnus não sejam ruins?

William Pursell
fonte

Respostas:

7

O objetivo -fé tentar evitar a necessidade de declarar todas as entradas de arquivo e evitar a necessidade de ler todas elas antes que elas sejam exibidas. É uma opção "meta" que apenas desativa outras opções.

Então, sim, ele deve fazer o que você espera. Não sei responder por que não, mas acho que você pode ter um alias de shell ou outra coisa que insira opções adicionais no comando. Isso pode reativar um recurso do que -fdesabilitar e ser considerado "mais específico", portanto, tenha precedência.

Daniel Pittman
fonte
2
Argghh. ls () {/ bin / ls -FB $ @; Scripts de inicialização estúpidos.
William Pursell
11
Hmm. Cancele a configuração da função e ainda vejo o mesmo comportamento, mesmo quando executo / bin / ls.
William Pursell
Faça / bin / ls -f -1 (isso é menos um, não menos-ell). O / bin / ls em uma caixa RHEL Estou usando formatos de nomes de arquivo em colunas por algum motivo.
22611 Bruce Ediger
0

Uma otimização foi adicionada no 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.

A primeira explicação que vem à mente é que você está executando uma versão mais antiga do coreutils. Você precisa atualizar.

Gilles 'SO- parar de ser mau'
fonte