ディレクトリファイル情報を取得する方法

ディレクトリファイル情報を取得する方法

特定のディレクトリに関する情報を取得する必要があります。基本的に、小型、中型、および大規模ファイル間の相関関係を知る必要があります。

私はこれを思い出しました:

for i in K M G; do
  printf $i
  du -h /usr/opt |
    awk '{print $1}' |
    grep ${i}$ |
    wc -l
done | tee /stat.out

その後、結果に基づいてすべての数値を加算し、合計を減算して1k未満のファイル数を取得します。 (ソースファイルだからたくさんあると思います)

とにかく、この方法は小さなディレクトリに役立ちます。実際、非常に大きなディレクトリ(1Teraを超えると予想)があり、ファイルの配布がわかりません。これらすべてのファイルを個人用リポジトリにコピーする必要があり、コピーにかかる時間を提供する必要があります。

私は次のようにするつもりです。

find pwd |xargs ls -lph |awk '{print $5}' 

しかし、何を入れるべきか、それとも別のアプローチを取るべきかわかりません。

答え1

GNU find(組み込みのLinuxまたはCygwin)にアクセスできる場合は、findファイルサイズを印刷して出力を後処理して、awk各サイズをカテゴリ別にソートし、カテゴリsort別にグループ化するか、結果をきれいに印刷します。それは次のとおりです。uniqawksed

find /usr/opt -type f -printf '%s\n' |
awk '{
    if ($1 ~ /^[2-9]......../) { print "3 G" }
    else if ($1 >= 1073741824) {  print "3 G" }
    else if ($1 >= 1048576) { print "2 M" }
    else if ($1 >= 1024) { print "1 k" }
    else if ($1 >= 1) { print "0" }
}' |
sort | uniq -c |
awk '{print $1 " files are in the " $3 "B range"}'

答え2

私が思いついた最高の解決策は、awkスクリプトを使用することでした。

{
if ( substr( $5, length($5), length($5) ) == "K" ) {
        totK++;
        totKsize = totKsize + substr($5, 0, length($5) - 1 );}
else if ( substr( $5, length($5), length($5) ) == "M" ) {
        totM++;
        totMsize = totMsize + substr($5, 0, length($5) - 1 );}
else if ( substr( $5, length($5), length($5) ) == "G" ) {
        totG++;
        totGsize = totGsize + substr($5, 0, length($5) - 1 );}
else  {
        totB++;
        totBsize=totBsize + $5; }
}
END{
print "NR of files less than 1k => " totB " total " totBsize;
print "NR of files less than 1M => " totK " total " totKsize;
print "NR of files less than 1G => " totM " total " totMsize;
print "NR of files bigger than 1G => " totG " total " totGsize;
}

次のようにパスを実行します。

find . -type f |xargs ls -lh |/usr/xpg4/bin/awk -f count_files.awk

関連情報