
約100,000ファイルのディレクトリがあります。 ls -fが1分以上中断されます。私はstraceを実行してすぐにgetdentを見始めたので、ディレクトリをはっきりと読みました。また、brkへの呼び出しがたくさんあるため、lsがメモリにバッファリングすることは明らかです。私はreaddirを呼び出してファイル名を出力する単純なプログラムを書いて、すぐに応答します。ただし、ls -f は出力を提供しません。何を提供しますか?私の考えでは、-fのポイントは、lsにreaddirのみを実行させることです。ディレクトリの内容をリストする移植可能で信頼性の高い方法はありますか? (参考までに、これはLinuxのgnu coreutilsにあるlsです。)
-編集する-
エイリアスもありますが、「/bin/ls -1f > /dev/null」は8~15秒かかり、「/bin/ls -1fx > /dev/null」は4~11秒かかりますが、単純なプログラムreaddirのみ可能 0.011秒がかかります。 gnu lsをあまりひどくするにはどうすればよいですか?
答え1
要点-f
は、各ファイル項目を計算する必要がなく、項目を表示する前にすべてのファイル項目を読み取る必要がないことです。他のオプションを無効にする「メタ」オプション。
はい。あなたの期待に応えなければなりません。なぜそうでないのかは答えられませんが、シェルエイリアスやコマンドに追加のオプションを挿入することがあると思います。これは機能を無効にするのではなく、再度有効にすることができ、-f
「より具体的な」と見なされるため、優先順位を付けます。
答え2
coreutils 7.0 に追加された最適化 (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.
最初に浮かぶ説明は、以前のバージョンのcoreutilsを実行していることです。アップグレードする必要があります。