答案1
ls
不会产生总数,但du
可以
du -sch *.csv
16K LdevInfo.csv
8.0K LunInfo.csv
4.0K W.csv
4.0K WwnInfo.csv
32K total
wc
将总共产生
wc -l *.csv
101 LdevInfo.csv
66 LunInfo.csv
62 W.csv
8 WwnInfo.csv
237 total
然后简单地join
join -j 2 -o 1.1,2.1,2.2 v w
101 16K LdevInfo.csv
66 8.0K LunInfo.csv
62 4.0K W.csv
8 4.0K WwnInfo.csv
237 32K total
在哪里
-j 2
告诉 join 使用字段 2 进行匹配-o 1.1,2.1,2.2
打印指定的fileld FILENUM.FIELDNUM
或者,您可以使用额外的 awk 来漂亮地格式化
join -j 2 v w| awk '{printf "%s\t%s\t%s\n",$2,$3,$1}'
101 16K LdevInfo.csv
66 8.0K LunInfo.csv
62 4.0K W.csv
8 4.0K WwnInfo.csv
237 32K total
PS:我没有*.png
使用过,*.csv
但这应该可以。
答案2
首先,您必须使用以下函数修复 ls 不包含总计的问题:
myls() {
if [ $# -gt 1 ] ; then
ls -1sh "$@"
ls -1s "$@" | cut -d' ' -f1 | awk '{s+=$1} END {print s}' | numfmt --to=iec --suffix=' total'
else
ls -1sh "$1"
fi
}
您可以将其放入您的.bashrc
并加载它。
之后您必须合并输出。有多种方法可以做到这一点。这是一个:首先用粘贴将所有输出组合起来。不幸的是,粘贴只接受文件作为参数,但您可以使用命名管道来处理:
combined() {
paste <(wc -l "$@") <(myls "$@") | awk '{print $1, $3, $4}' | sort
}
你可以把这个功能放在你的.bashrc
now.我对它们进行了排序,因为我认为这是模式可读的。| sort
如果您不想对它们进行排序,可以将其删除。
如果你不想使用额外的功能,你可以这样做:
myd() {
if [ $# -gt 1 ] ; then
tmp=`ls -1sh "$@";ls -1s "$@" | cut -d' ' -f1 | awk '{s+=$1} END {print s}' | numfmt --to=iec --suffix=' total'`
else
tmp=`ls -1sh "$1"`
fi
paste <(wc -l "$@") <(echo "$tmp") | awk '{print $1, $3, $4}' | sort
}