最大の単一ファイルを見つける

最大の単一ファイルを見つける

私たちは4TBのサイズの共有をホストします。最大サイズのファイルを見つけるのはどのくらい効率的ですか?

通常、次を使用します。

du -ak | sort -k1 -bn | tail -1

このように大きな共有をスキャンしてから並べ替えるのは簡単ではありません。

共有で最大のファイルのみを理解するための提案です。

また、du -ak現在のディレクトリのサイズも返します(例: ".123455")。これをどのように避けることができますか?

答え1

最大のファイルを決定するために、関連ディレクトリツリーをスキャンしてファイルサイズを収集する以外に、他の方法はありません。サイズしきい値が存在することがわかっている場合は、findにこのしきい値サイズより小さいファイルを無視するように指示できます。

$ find . -type f -size +50M ....

50MB未満のファイルは無視されます。ファイルが常に特定の場所にあることがわかっている場合は、ディスク全体をスキャンするのではなく、その領域をターゲットfindとしてファイルを指定できます。

メモ:/var通常、フォーマットされていないディレクトリに任意のファイルをインポートしないでください。これが私が一般的に使用する方法です。

duスイッチを使用して、人間が読める形式で寸法を出力するように指示できます-h。また、このsortコマンドはスイッチを使用してソートする方法も知っています-h

はい

$ find /home/saml/apps -type f -size +50M -print0 | \
    du -h --files0-from=- | sort -h | tail -1
1.4G    /home/saml/apps/MeVisLabSDK2.2.1_gcc-64.bin

上記のコードは、null()文字を区切り文字として使用してfind50 MBを超えるファイルのリストを返します。\0コマンドduはこのリストを使用し、--files0-from=-スイッチを使用してNull値を分割する方法を知っています。その後、この出力は人工的にフォーマットされたサイズに従ってソートされます。

いいえtail -1:

$ find /home/saml/apps -type f -size +50M -print0 | \
    du -h --files0-from=- | sort -h
55M /home/saml/apps/MeVisLabSDK/Packages/MeVis/ThirdParty/lib/libQtXmlPatternsMLAB.so.4.6.2.debug
55M /home/saml/apps/MeVisLabSDK/Packages/MeVis/ThirdParty/Sources/Qt4/qt/lib/libQtXmlPatternsMLAB.so.4.6.2.debug
56M /home/saml/apps/MeVisLabSDK/Packages/FMEwork/ThirdParty/lib/libitkvnl-4.0_d.a
66M /home/saml/apps/MeVisLabSDK/Packages/FMEwork/Release/lib/libMLDcmtkAccessories_d.so
79M /home/saml/apps/MeVisLabSDK/Packages/FMEwork/Release/lib/libMLDcmtkMLConverters_d.so
94M /home/saml/apps/MeVisLabSDK/Packages/MeVis/ThirdParty/lib/libQtGuiMLAB.so.4.6.2.debug
94M /home/saml/apps/MeVisLabSDK/Packages/MeVis/ThirdParty/Sources/Qt4/qt/lib/libQtGuiMLAB.so.4.6.2.debug
112M    /home/saml/apps/ParaView-3.14.1-Linux-64bit.tar.gz
204M    /home/saml/apps/Slicer-4.1.1-linux-amd64.tar.gz
283M    /home/saml/apps/MeVisLabSDK/Packages/FMEwork/Release/lib/libMLDcmtkIODWrappers_d.so
1.4G    /home/saml/apps/MeVisLabSDK2.2.1_gcc-64.bin

答え2

最大のファイルを見つけるには、ディレクトリツリー全体を調べて各ファイルのサイズを確認する必要があります。

zshでは、ファイルをサイズでソートする簡単な方法があります。o グローバル予選:

print -rl -- **/*(D.oL)

最大のファイルのみを表示するには:

echo **/*(D.oL[-1])

最大10個のファイルを表示するには:

print -rl -- **/*(D.oL[-10,-1])

ls -Sサイズ別にファイルの並べ替えを使用することもできます。たとえば、次は最大のファイルトップ10を示しています。 bashでは、shopt -s globstar再帰ワイルドカードを有効にする前に実行する必要があります**。 ksh93ではset -o globstar最初に実行し、zshではすぐに使用できます。この方法は、ファイル名の合計長がコマンドライン制限を超えるほど多くのファイルがない場合にのみ機能します。

ls -Sd **/* | head -n 10

大量のファイルが多い場合は、情報の収集に時間がかかる可能性があるため、ファイルシステムを一度だけ移動して出力をテキストファイルに保存する必要があります。単一のファイルに興味があるので。他にも-SGNUオプションを使用できます。これにより、ディレクトリ表示にはサブディレクトリ内のファイルのサイズが含まれず、そのディレクトリに直接存在するファイルのみが含まれるため、ノイズが軽減されます。du-a

du -Sak >du
sort -k1n du | head -n 2

ファイルサイズのみが必要な場合は、GNU検索-printf操作を使用できます。

find -type f -printf '%s\t%P\n' | sort -k1n >file-sizes.txt
tail file-sizes.txt

ファイル名に改行文字が含まれていると、自動処理は中断されます。ほとんどのGNUユーティリティには、nullバイト(ファイル名には現れません)を使用する方法があります(たとえばdu -0sort -zなど\0\n

関連情報