Bash 使用awk获取文件的完整路径名及其大小
我想获取所有大小为MB或GB的文件的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
文件名,后跟它们的大小
。到目前为止,我已经做了很多:
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}”“
Parsingls
?这个想法很好,但最好推荐ls
以外的其他工具,可能是du
或stat
不是POSIX,它通常在Linux上可用,但在其他Unix上不可用。du
可能。我同意解析ls
一般来说是件坏事,但直到stat
(与大多数语言一样),如果需要文件大小,则需要解析一些外部程序输出。