【发布时间】:2016-01-12 19:21:04
【问题描述】:
对于 uni 的问题,我需要获取一系列目录中 5 个最大文件的文件大小和文件名。为此,我使用了两个函数,一个使用 ls -l 加载所有内容(我意识到从 ls 解析信息不是一个好方法,但这个特定问题表明我不能使用 find、locate 或 du) .然后将 ls 输出中的每一行发送到另一个函数,该函数使用 awk 应该提取文件大小和文件名并将其存储到数组中。相反,我似乎越来越 awk 试图从 ls 打开每一列以进行阅读。 代码如下:
function addFileSize {
local y=0
local curLine=$1
if [[ -z "${sizeArray[0]}" ]]; then
i=$(awk '{print $5}' $curLine)
nameArray[y]=$(awk '{print $9}' $curLine)
elif [[ -z "${sizeArray[1]}" ]]; then
i=$(awk '{print $5}' $curLine)
nameArray[y]=$(awk '{print $9}' $curLine)
elif [[ -z "${sizeArray[2]}" ]]; then
i=$(awk '{print $5}' $curLine)
nameArray[y]=$(awk '{print $9}' $curLine)
elif [[ -z "${sizeArray[3]}" ]]; then
i=$(awk '{print $5}' $curLine)
nameArray[y]=$(awk '{print $9}' $curLine)
elif [[ -z "${sizeArray[4]}" ]]; then
i=$(awk '{print $5}' $curLine)
nameArray[y]=$(awk '{print $9}' $curLine)
fi
for i in "${sizeArray[@]}"; do
echo "$(awk '{print $5}' $curLine)"
if [[ -z "$i" ]]; then
i=$(awk '{print $5}' $curLine)
nameArray[y]=$(awk '{print $9}' $curLine)
break
elif [[ $i -lt $(awk '{print $5}' $curLine) ]]; then
i=$(awk '{print $5}' $curLine)
nameArray[y]=$(awk '{print $9}' $curLine)
break
fi
let "y++"
done
echo "Name Array:"
echo "${nameArray[@]}"
echo "Size Array:"
echo "${sizeArray[@]}"
}
function searchFiles {
local curdir=$1
for i in $( ls -C -l -A $curdir | grep -v ^d | grep -v ^total ); do # Searches through all files in the current directory
if [[ -z "${sizeArray[4]}" ]]; then
addFileSize $i
elif [[ ${sizeArray[4]} -lt $(awk '{print $5}' $i) ]]; then
addFileSize $i
fi
done
}
任何帮助将不胜感激,谢谢。
【问题讨论】:
-
在每个目录上使用
stat -c'%s %n' *之类的东西怎么样?一旦你连接所有你可以sort -rn | head -5. -
你可以使用 GNU stat 吗?