多くのサブディレクトリとN個のファイルがあるディレクトリで、上位10個の大容量ファイルを見つけようとしています。私のfind
コマンドはすべてのファイルをリストし、ソートモードに入るので時間がかかります。より速い実行が必要です。最新の実行では、リスト自体が15分以内に完了しなかったため、実行を終了する必要がありました。
次のコマンドを使用しましたが、find
すべて十分に速く実行されずに中断されます。
find /opt/app -type f -print 2>/dev/null | xargs ls -lS 2>/dev/null |
sort -k5,5rn | head -10
find /opt/app -xdev -ls | awk '{print $7, $11}' | " sort -rn "}' | head
find /opt/app -type f -exec ls -lS {} + 2>/dev/null | head -n 10 |
awk '{ print $5, $9 }'
より良いアプローチは何ですか?
ベストアンサー1
いずれにせよ、その中のすべてのディレクトリの内容を読み、実行する必要がありますlstat()
。つまり、どのファイルが最大であるかを判断する前に、inodeデータを読み取ってすべてのファイルのファイルサイズを調べることを意味します。
ディスク(またはネットワークファイルシステムの場合はネットワーク)I / Oアクセス(すべての情報がメモリにキャッシュされていない場合)は、最も時間がかかる部分です。
あなたの方法は、ユーザー/グループIDをユーザー/グループ名に変換し、タイムスタンプのカレンダー表現を計算し、バイトを文字にデコードするなど、不要なタスクをたくさん実行し、これらのタスクはCPUとディスクを使い続けます。ただし、ディスクI / Oはまだ忙しい状態になる可能性があります。ボトルネック。
zsh
例のglobおよびglob修飾子を使用すると、不要な処理の大部分をスキップできます。
ls -ldS /opt/apps/**/*(.DOL[1,10])
zsh
O
ファイルのリストは長さ(明白なサイズ)でソートされますが、まだサイズでソートするL
必要があります。それ以外の場合は名前で並べ替えられます。 GNU実装では、を使用してソートをスキップできます。実装では、人間が読めるサイズ(KMGTPE ... 1024ベースのサフィックスを使用)のオプションもサポートされており、他の多くの実装からコピーされました。-S
ls
S
ls
ls
-U
-h
h
または(最新の)GNUツールを使用してください。
(export LC_ALL=C # avoid decoding bytes into characters and
# complex sorting orders. Note that it may affect
# the ls -l output format though.
find /opt/apps -type f -printf '%s/%p\0' |
sort -srnz |
head -z |
cut -zd/ -f2- |
xargs -r0 ls -ldS)
これで作業を迅速にすることを確認してください。