私の目標は、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/null
、2
標準エラーはどこにありますか?) - 結果をファイル(
> 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
巨大なサイズを誤って報告する希少ファイルであるため、無視されます(つまり、ディスクがいっぱいの問題を引き起こさない)。
-printf
GNUルックアップのみ。この場合、ファイルサイズ(バイト)とファイルのフルパスが印刷されます。
実際には、コマンド以降のすべての内容を保持できます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