web-dev-qa-db-ja.com

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

サイズ4TBのシェアをホストします。最大サイズのファイルを見つけるのはどのくらい効率的ですか。

通常私たちは使用します:

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

そして、そのような巨大なサイズのシェアをスキャンして、それらを再度ソートすることは簡単ではありません。

共有内の単一の最大ファイルのみを知るための提案。

そしてdu -akは、( "。123455")のような現在のディレクトリのサイズを返します。どうすればそれを回避できますか?

4
Avinash

問題のディレクトリツリーをスキャンしてファイルサイズを収集し、最大のファイルを特定する以外に、他の方法はわかりません。サイズのしきい値があることがわかっている場合は、このしきい値サイズ未満のファイルを閉じるように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

上記のfindは、区切り文字としてnull(\0)文字を使用して、50MBを超えるファイルのリストを返します。 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
6
slm

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

Zshでは、oglob qualifier のおかげで、ファイルをサイズで並べ替える簡単な方法があります。

_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
_

大きなファイルがたくさんある場合、情報の収集には非常に長い時間がかかる可能性があるため、ファイルシステムを1回だけトラバースして、出力をテキストファイルに保存する必要があります。個々のファイルに関心があるので、_-S_に加えてGNU duの_-a_オプションを使用します。このように、ディレクトリの表示サイズファイルはサブディレクトリに含まれず、そのディレクトリに直接含まれるファイルのみが含まれるため、ノイズが低減されます。

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

ファイルのサイズのみが必要な場合は、GNU findの_-printf_アクションを使用できます。

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

改行を含むファイル名がある場合、これは自動処理を台無しにすることに注意してください。ほとんどのGNUユーティリティには、代わりにnull_byte(ファイル名には使用できない)を使用する方法があります。例:__の代わりに_du -0_、_sort -z_、_\0\n_など.