Eu tinha um diretório que tinha cerca de 5 milhões de arquivos. Quando tentei executar o ls
comando dentro deste diretório, meu sistema consumiu uma quantidade enorme de memória e parou depois de algum tempo. Existe uma maneira eficiente de listar os arquivos que não sejam o ls
comando?
70
ls
esses usos--color
ou-F
isso significaria fazer umlstat(2)
para cada arquivo.ls
ligação pura ou você usou opções?Respostas:
Evite classificar usando:
Ou equivalente:
fonte
-1
bandeira pode ajudar.-1
demora ainda mais.-C
quando stdout é um terminal,-1
quando é um pipe) é confuso. Quando você está experimentando e medindo, alterna entre ver a saída (para garantir que o comando esteja fazendo o que você espera) e suprimi-la (para evitar o fator de confusão da taxa de transferência do aplicativo de terminal). Melhor usar comandos que se comportam da mesma forma em ambos os modos, então definir explicitamente o formato de saída via-1
,-C
,-l
, etc.ls
na verdade classifica os arquivos e tenta listá-los, o que se torna uma enorme sobrecarga se estivermos tentando listar mais de um milhão de arquivos dentro de um diretório. Conforme mencionado neste link, podemos usarstrace
oufind
para listar os arquivos. No entanto, essas opções também pareciam inviáveis para o meu problema, pois eu tinha 5 milhões de arquivos. Depois de algum pouco de googling, eu achei que, se listar os diretórios usandogetdents()
, que é suposto ser mais rápido, porquels
,find
ePython
bibliotecas de usarreaddir()
que é mais lento, mas usagetdents()
por baixo.Podemos encontrar o código C para listar os arquivos usando
getdents()
a partir daqui :Copie o programa C acima no diretório em que os arquivos precisam ser listados. Em seguida, execute os comandos abaixo.
Exemplo de tempos :
getdents
pode ser muito mais rápido quels -f
, dependendo da configuração do sistema. Aqui estão alguns horários que demonstram um aumento de velocidade de 40x para listar um diretório que contém cerca de 500k arquivos em uma montagem NFS em um cluster de computação. Cada comando foi executado 10 vezes em sucessão imediata, primeirogetdents
e depoisls -f
. A primeira execução é significativamente mais lenta que todas as outras, provavelmente devido a falhas na página de cache do NFS. (Além disso: nessa montagem, od_type
campo não é confiável, no sentido de que muitos arquivos aparecem como do tipo "desconhecido".)fonte
ls
?getdents
vsreaddir
erra o ponto.O motivo mais provável para a lentidão é a coloração do tipo de arquivo. Você pode evitar isso com
\ls
ou/bin/ls
desativando as opções de cores.Se você realmente possui tantos arquivos em um diretório, usar
find
também é uma boa opção.fonte
ls -U --color
levaria muito tempo, poisstat
cada arquivo seria usado. Então, ambos estão corretos.ls
e, por padrão, é alternativo em muitos e muitos.bashrc
s por aí./bin/ls -U
e obtive saída em pouco tempo, em comparação com a espera por muito tempo antesAcho que
echo *
funciona muito mais rápido que sl. YMMV.fonte
*
. Portanto, esse caminho provavelmente ainda é muito lento para 5 milhões de arquivos.