ディレクトリで最大のファイルを見つける - 時間がかかります

ディレクトリで最大のファイルを見つける - 時間がかかります

多くのサブディレクトリと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ベースのサフィックスを使用)のオプションもサポートされており、他の多くの実装からコピーされました。-SlsSlsls-U-hh

または(最新の)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)

これで作業を迅速にすることを確認してください。

おすすめ記事