web-dev-qa-db-ja.com

すべてのサブディレクトリのファイル名とファイルサイズを再帰的に出力しますか?

私の目標は、Linuxシステム上のすべてのファイルのファイルサイズ(MBまたはGB)を測定し、ファイル名とファイルサイズを再帰的に記録し、出力をタブ区切りのテキストファイルにパイプすることです。

これに適切なコマンドは何でしょうか?

次のようなコマンドを試すことができます。

ls -lhR > outputfile.txt

しかし、これが非常に非効率的であると私が考える理由があります。

http://mywiki.wooledge.org/ParsingLs

Forループを使用する方が適切でしょうか?

3
EB2127

これを試してください(GNU findで、ファイル名に二重引用符が含まれていないと仮定):

{
    printf '%s\t%s\n' size path
    find / \( -path /proc -o -path /sys \) -Prune -o -printf '%s\t"%P"\n' |
        numfmt --to=iec
} > outputfile.csv

小切手

man find | less +/'-printf format'

または

info --ind=-printf find
4
Gilles Quenot
Sudo du -h / 2>/dev/null > out.csv
  • Sudoを使用して、すべてのファイルを確実に読み取ります。
  • 使用する -h with du for "h uman readable" size format。
  • エラーを表示しない(2>/dev/null、 どこ 2は標準エラーです)
  • 結果をファイル(> out.csv)。

これにより、ファイルサイズとパスのリストが作成され、値の間にタブが表示されます。

6
Christopher

注:以下のコマンドは、要求したよりもわずかに多く機能しますが、他の人にとっては非常に役立つ場合があります。


これは、私が同僚と共同で作成し、ディスク全体を処理する必要があるアプリケーションサポートチームに与えたコマンドです。

find / -xdev \! -path /var/log/lastlog -printf '%s\t%p\n' | sort -rn | head | cut -f2- | xargs -n1 ls -lh | awk '{print $5, $NF}'

読みやすくするために改行した同じコマンドを次に示します。

find / -xdev \! -path /var/log/lastlog -printf '%s\t%p\n' |
  sort -rn | head | cut -f2- |
  xargs -n1 ls -lh | awk '{print $5, $NF}'

このコマンドは、ルートファイルシステム上の最大の10個のファイルを、人間が読める形式のファイルサイズとともに出力します。

このコマンドは、正確な結果を得るためにrootとしてを実行する必要があります。

-xdevファイルシステムの境界を越えないようにします。これは、NFSが遅い場合に重要になる可能性があります。

/var/log/lastlogは、巨大なサイズを誤って報告するスパースファイルであるため無視されます(つまり、ディスクがいっぱいになる問題の原因ではありません)。

-printfはGNU findに固有です。この場合、ファイルサイズをバイト単位で出力し、その後にファイルの完全パスを出力します。

実際には、headコマンドの後にすべてをオフにしておくことができます。失うのは、人間が読めるファイルサイズだけです。

したがって、次のコードは問題なく機能します。

find / -xdev \! -path /var/log/lastlog -printf '%s\t%p\n' | sort -rn | head

このコマンドしないに改行を含むファイル名がある場合は機能します。ただし、このコマンドは人間のオペレーターによる手動処理(スクリプトでは使用しない)を対象としているため、重要ではありません。


今、あなたの特定の質問に答えるために:

私の目標は、Linuxシステム上のすべてのファイルのファイルサイズ(MBまたはGB)を測定し、ファイル名とファイルサイズを再帰的に記録し、出力をタブ区切りのテキストファイルにパイプすることです。

MBまたはGBの要件を無視して、ファイルサイズをバイト単位で報告します。これは非常に簡単なので、はるかに簡単です。どうしても必要な場合にこれを行う方法については、上記のコマンドを参照してください。

Sudo find / -printf '%s\t%p\n' > outputfile.txt
2
Wildcard

あなたはチェックアウトする必要があります ncd これは、デフォルトですべてのフォルダーのファイルサイズを取得するncursesを使用したduコマンドです。

2
Jorge Heleno

GNU statおよびbashglobstar

shopt -s globstar
stat --printf="%s\t%n\n" -- ** | numfmt -d $'\t' --to=iec >out.csv

これにはディレクトリも含まれますが、それらもファイルです...

@Patrickが指摘するように、これはargument list too long**。代わりにfindを使用できます:

Sudo find / -type f -exec stat --printf="%s\t%n\n" -- {} \; | numfmt -d $'\t' --to=iec
1
m0dular