我希望获得大小为MB或GB的所有文件的file names followed by their size
。到目前为止,我做了这么多:
LIST=$(ls -lh -d -1 $PWD/{*,} | awk '{ print $9":"$5 }')
for i in $LIST
do
if [[ $( echo "$i" | cut -f2 -d: | egrep "M|G" | wc -l) -ne 0 ]]
# egrep not working, only finds M
then
echo "$i" >> bigfiles
fi
done
我得到的是:
amit@C0deDaedalus:~$ test/findbig
/home/amit/Batch:3.8M
/home/amit/Black:3.6M
我想要的是:
amit@C0deDaedalus:~$ test/findbig
/home/amit/Batch File Programming.pdf:3.8M
/home/amit/Black Panther - Legend Has It ( Instrumental ).opus:3.6M
基本上,除了filenames
之外,一切都很好,但我得到的并不完整。只显示第一个单词。我无法弄清楚逻辑或语法是否有问题,但我认为它与awk
有关。
那么,如何在输出中获取文件的完整路径名(中间有空格)?
我尝试了loop trick in awk,但不知道如何让两个列适合。
答案 0 :(得分:0)
问题是由于文件名中的空格。 for循环使用空格作为分隔符。因此,列表中的第一项将是“/ home / amit / Batch”,第二项是“文件”,依此类推。
您可以使用while循环而不是for,例如:
ls -lh -d -1 $PWD/{*,} | awk '{ print $9":"$5 }' | while read LINE
do
echo ${LINE}
# do your stuff here
done
顺便说一句,如果您的唯一目的是找出大文件,您可能需要查看磁盘使用情况命令:
$ du -a | sort -rn | head
答案 1 :(得分:0)
您可以使用read
以及ls -l
列表右侧方便出现的文件名。 read
将所有“额外”字段放入最终变量中:
function f_getfields
{
local perm lnk uname grp size d1 d2 d3 filename
while read perm lnk uname grp size d1 d2 d3 filename
do
echo "$filename $size"
done < <(ls -l)
}
f_getfields