2016-07-08 47 views
3

我想创建一个脚本,获取扩展和报告在两列,用户和用户拥有该扩展的文件数量。 结果必须打印在report.txt中与剪切和grep报告

这是我的代码。

#!/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和切?

+0

你能给输入和预期的输出? – Fazlin

+3

'grep“*。$ 1”| ......'greps ins stdin。你的程序永远在等待着。我没有文件参数或缺少输入管道。 –

+0

你可以用'find $ folder -name'*。$ 1“-printf”%P \ t%u \ n“>> report.txt'来代替for循环,然后用一些wc。 –

回答

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

很好地完成了;来补充你的GNU'stat'语法与BSD/OSX'stat'的语法:'-c'%U''必须替换为'-f'%Su''。 – mklement0

+1

很好的答案。就一件事。根据glob将显示的文件数量,“stat”的参数列表可能会变得太长。基于“find”的解决方案将更加稳定。 – hek2mgl

+1

@ hek2mgl:这是一个值得关注的问题,但是您可以用'printf'%s \ 0'*。“$ 1”来修复这个问题。 xargs -0 stat ...'(因为'printf'是一个Bash _builtin_,它不受最大命令行长度限制的限制)。 – mklement0

0

你并不需要为这个循环(除非您以后需要循环几个文件夹),并改变工作目录的脚本是很少必要。另外,通常不建议阅读ls输出。

这里有一个版本,它取代了环,并使用du

ext="$1" 

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

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

我认为OP需要文件的_count_,而不是合并的存储大小。此外,您错过了用户名称分组。 – mklement0

+0

@ mklement0我将“文件数量”解释为“文件的组合大小”。这并不完全清楚。我还假设稍后'$ folder'将用于识别用户名(主目录)。 – Kusalananda