如何在 find 命令中以人类可读的格式显示大小

如何在 find 命令中以人类可读的格式显示大小

我正在尝试在以下 find 命令中以人类可读的格式显示文件大小

 find $BASE_DIR/ -user $USER -size +$LOWERSIZELIMIT -mtime +$MY_MTIME -type f -printf      "%s %p\n" 2> /dev/null | 
 sort -nr | 
 head -n $NUMFILES >> $TESTFILE

我的查找大文件的函数如下所示。它以 $1 作为参数,以便将基本目录路径传递给 find 命令。

 function find_files {
 #echo "In find files"
 # $1 = base directory from where to start the search

 find $1/ -user $USER -size +$LOWERSIZELIMIT -mtime +$MY_MTIME -type f -printf "%s %p\n" 2> /dev/null | sort -nr | head -n $NUMFILES >> $TESTFILE

 if [[ -s $TESTFILE ]] ; 
 then 
   echo "***********************************************************************" >> $DUMPFILE
   echo "***********************************************************************" >> $DUMPFILE
   echo "***********************************************************************" >> $DUMPFILE
   echo "***********************************************************************" >> $DUMPFILE
   #cat $TESTFILE
   cat $TESTFILE >> $DUMPFILE
   rm $TESTFILE
   return 0
 else
   return 1
 fi
 }

答案1

使用 find 的 -exec 选项(不要忘记以 \; 结尾)如果您只需要 exec 命令中的部分信息,请使用 awk 进行解析。

find $BASE_DIR/ -user $USER -size +$LOWERSIZELIMIT -mtime +$MY_MTIME -type f -exec /bin/ls -hl {} \;

如果您不想要 ls 的可读输出,请使用其他命令,或者像这样使用 awk

find $BASE_DIR/ -user $USER -size +$LOWERSIZELIMIT -mtime +$MY_MTIME -type f -exec /bin/ls -hl {} \; | awk '{ print $5,$9 }'

find 的 exec 中最棘手的部分是使用 {} 作为找到的结果项,并且命令必须以 \; 结尾。如果同一行上有一系列用 ; 分隔的命令,则需要结束 find,然后添加 ; 因此有 2 个,例如一些命令; find $BASE_DIR/ -user $USER -size +$LOWERSIZELIMIT -mtime +$MY_MTIME -type f -exec /bin/ls -hl {} \;; 一些命令;

答案2

这里的微妙之处在于sort,你不能(轻松且正确地)对人类可读的数字进行排序(除非你有sort来自GNU 核心实用程序>= 7.5,它支持一个-h选项,例如du -h | sort -h)。

将以下内容保存至hr.awk

BEGIN { split("KMGTPEZY",suff,//)}
{
  match($0,/([0-9]+)[ \t](.*)/,bits)
  sz=bits[1]+0; fn=bits[2]
  i=0; while ((sz>1024)&&(i<length(suff))) { sz/=1024;i++ }
  if (i) printf("%.3f %siB %s\n",sz,suff[i],fn)
  else   printf("%3i B %s\n",sz,fn)
}

然后你可以这样做:

find $BASE_DIR/ -user $USER -size +$LOWERSIZELIMIT -mtime +$MY_MTIME \
  -type f -printf "%s %p\n" 2> /dev/null | sort -nr |
  gawk -f hr.awk | head -n $NUMFILES >> $TESTFILE

gawk 脚本接受find ... -printf "%s %p\n"输入,并将第一个字段转换为带有后缀的人类可读的大小(以 IEC 2 10单位为单位)。

另请参阅这个热门问题:https://serverfault.com/questions/62411/how-can-i-sort-du-h-output-by-size

相关内容