すべてのサブディレクトリのファイル名とファイルサイズを繰り返し出力しますか?

すべてのサブディレクトリのファイル名とファイルサイズを繰り返し出力しますか?

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

これに対する適切なコマンドは何ですか?

次のコマンドを試してみてください。

ls -lhR > outputfile.txt

しかし、私はこれが非常に非効率的だと思う理由があります。

http://mywiki.wooledge.org/ParsingLs

forループを使用する方が適切ですか?

答え1

sudo du -h / 2>/dev/null > out.csv
  • sudoすべてのファイルを読み取ったことを確認するために使用されます。
  • -hそして使用duは」時間人が読める「サイズ形式」です。
  • エラーを表示しない(2>/dev/null2標準エラーはどこにありますか?)
  • 結果をファイル(> out.csv)に送信します。

これにより、値の間にタブ文字を含むファイルサイズとパスを含むリストが生成されます。

答え2

これを試してみてください(GNUfindとファイル名に二重引用符文字が含まれていないと仮定):

{
    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

答え3

注:以下のコマンドはあなたが要求したものより少し複雑ですが、他の人にとっては非常に便利です。


以下は、同僚と開発してディスク全体を処理する必要があるアプリケーションサポートチームに提供するコマンドです。

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巨大なサイズを誤って報告する希少ファイルであるため、無視されます(つまり、ディスクがいっぱいの問題を引き起こさない)。

-printfGNUルックアップのみ。この場合、ファイルサイズ(バイト)とファイルのフルパスが印刷されます。

実際には、コマンド以降のすべての内容を保持できます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

答え4

GNUを使用しstatて、次の操作を行いますbash globstar

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

関連情報