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

9

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

-EDIT -

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 que apenas faz o readdir leva 0,011 segundos. O que eu preciso fazer para não deixar os gnu ls sugarem?

    
por William Pursell 02.02.2012 / 19:13

2 respostas

7

O ponto de -f é tentar evitar a necessidade de registrar todas as entradas de arquivo e evitar a necessidade de lê-las antes de serem exibidas. É uma opção "meta" que apenas desativa outras opções.

Então, sim, deve fazer o que você espera. Eu não posso responder porque não é, mas eu acho que você pode ter um alias de shell ou qualquer outra coisa que insira opções adicionais para o comando. Isso pode reativar um recurso que -f desativa e ser considerado "mais específico", portanto, tenha precedência.

    
por 02.02.2012 / 19:17
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.

    
por 07.02.2012 / 02:04