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

Bash 使用awk获取文件的完整路径名及其大小,bash,list,awk,spaces,Bash,List,Awk,Spaces,我想获取所有大小为MB或GB的文件的文件名,后跟它们的大小。到目前为止,我已经做了很多: 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, onl

我想获取所有大小为MB或GB的文件的
文件名,后跟它们的大小
。到目前为止,我已经做了很多:

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
基本上,除了我得到的不完整的
文件名之外,一切都正常。只显示第一个单词。我不知道逻辑或语法是否有问题,但我认为这与
awk
有关

那么,如何在输出中获得文件的完整路径名(中间有空格)


我已经尝试了,但不知道如何将这两列都放进去。

问题在于文件名中的空格。for循环使用空格作为delimeter。因此,列表中的第一项是“/home/amit/Batch”,第二项是“File”,依此类推

您可以使用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

您可以使用
read
和方便地出现在
ls-l
列表右侧的文件名<代码>读取
将所有“额外”字段放入最终变量:

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
函数f_getfields { 本地perm lnk uname grp大小d1 d2 d3文件名 读取perm lnk uname grp大小d1 d2 d3文件名时 做 回显“$filename$size”
因为文件名中的空格也是列表中的分隔符。您可以简化脚本,只需执行
du-BM$PWD | awk'$1~/M | G/&&&$1!=“0M”{print$2:“$1}”“
Parsing
ls
?这个想法很好,但最好推荐
ls
以外的其他工具,可能是
du
stat
不是POSIX,它通常在Linux上可用,但在其他Unix上不可用。
du
可能。我同意解析
ls
一般来说是件坏事,但直到de>bash具有内置的
stat
(与大多数语言一样),如果需要文件大小,则需要解析一些外部程序输出。