我正在尝试在以下 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