我尝试创建一个获取扩展程序的脚本,并在两列中报告,用户和用户拥有该扩展名的文件数量。 结果必须打印在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来解决这个问题?
答案 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