用cut和grep报告

时间:2016-07-08 19:22:58

标签: bash shell grep cut

我尝试创建一个获取扩展程序的脚本,并在两列中报告,用户和用户拥有该扩展名的文件数量。 结果必须打印在report.txt

这是我的代码。

#!/bin/bash

#Uncoment to create /tmp/test/ with 50 txt files
#mkdir /tmp/test/
#touch /tmp/test/arch{01..50}.txt

clear

usage(){
    echo "The script needs an extension to search"
    echo "$0 <extension>"
}

if [ $# -eq 0 ]; then
    usage
    exit 1
fi

folder="/tmp/test/"
touch report.txt
count=0
pushd $folder

for file in $(ls -l); do
    grep "*.$1" | cut -d " " -f3 >> report.txt
done

popd

该计划无休止地运行。我甚至没有为每个用户计算文件。 我怎样才能使用grep和cut来解决这个问题?

2 个答案:

答案 0 :(得分:2)

使用GNU stat

stat -c '%U' *."$1" | sort | uniq -c | awk '{print $2,"\t",$1}' > report.txt

正如mklement0所指出的,在BSD / OSX下你必须使用-f stat选项:

stat -f '%Su' *."$1" | sort | uniq -c | awk '{print $2,"\t",$1}' > report.txt

修改:

要处理许多文件并避免参数编号限制,最好使用printf管道传递给stat命令(再次感谢mklement0):

printf '%s\0' *."$1" | xargs -0 stat -c '%U' | sort | uniq -c | awk '{print $2,"\t",$1}'

答案 1 :(得分:0)

您不需要循环(除非您以后需要循环遍历多个文件夹),并且很少需要更改脚本中的工作目录。此外,通常不建议阅读ls输出。

这是一个替换循环的版本,并使用du

ext="$1"

printf "Folder '%s':\t" "$folder" >>report.txt

du -hc "$folder"/*."$ext" | sed -n '$p' >>report.txt