私の目標は、Linuxシステム上のすべてのファイルのファイルサイズ(MBまたはGB)を測定し、ファイル名とファイルサイズを再帰的に記録し、出力をタブ区切りのテキストファイルにパイプすることです。
これに適切なコマンドは何でしょうか?
次のようなコマンドを試すことができます。
ls -lhR > outputfile.txt
しかし、これが非常に非効率的であると私が考える理由があります。
http://mywiki.wooledge.org/ParsingLs
Forループを使用する方が適切でしょうか?
これを試してください(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
Sudo du -h / 2>/dev/null > out.csv
Sudo
を使用して、すべてのファイルを確実に読み取ります。-h
with du
for "h uman readable" size format。2>/dev/null
、 どこ 2
は標準エラーです)> out.csv
)。これにより、ファイルサイズとパスのリストが作成され、値の間にタブが表示されます。
注:以下のコマンドは、要求したよりもわずかに多く機能しますが、他の人にとっては非常に役立つ場合があります。
これは、私が同僚と共同で作成し、ディスク全体を処理する必要があるアプリケーションサポートチームに与えたコマンドです。
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
あなたはチェックアウトする必要があります ncd これは、デフォルトですべてのフォルダーのファイルサイズを取得するncursesを使用したdu
コマンドです。
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