如何获取目录文件信息

如何获取目录文件信息

我需要获取特定目录的信息,基本上我需要知道小文件、中文件和大文件之间的相关性。

我想出了这个:

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并按uniq类别进行分组,awk或者sed漂亮地打印结果。就像是:

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

相关内容