使用awk获取文件的完整路径名及其大小

时间:2018-04-26 06:43:46

标签: bash list awk spaces

我希望获得大小为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,但不知道如何让两个列适合。

2 个答案:

答案 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