【问题标题】:Reporting with cut and grep使用 cut 和 grep 进行报告
【发布时间】:2016-11-11 10:56:43
【问题描述】:

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

【问题讨论】:

  • 你能给出输入和预期输出吗?
  • grep "*.$1" | ... greps 输入标准输入。你的程序永远在等待。我没有文件参数或缺少输入管道。
  • 你可以用 find $folder -name "*.$1" -printf "%P\t%u\n" &gt;&gt; report.txt 之类的东西替换 for 循环,然后是一些 wc。
  • 你为什么使用ls -l?您最终会获取所有文件属性,而不仅仅是名称。
  • ls *.$1 | wc -l 怎么样。

标签: bash shell grep cut


【解决方案1】:

使用 GNU stat

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

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

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}'

【讨论】:

  • 干得好;用 BSD/OSX 的 stat 补充你的 GNU stat 语法:-c '%U' 必须替换为 -f '%Su'
  • 好答案。就一件事。根据 glob 将显示的文件数量,stat 的参数列表可能会变得太长。基于find 的解决方案会更稳定。
  • @hek2mgl:这是一个有效的问题,但你可以用printf '%s\0' *."$1" | xargs -0 stat ... 解决这个问题(因为printf 是一个Bash 内置,它不受最大值的限制。命令行长度限制)。
  • 它不会在文件上打印任何内容。
【解决方案2】:

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

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

ext="$1"

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

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

【讨论】:

  • 我认为 OP 想要 count 个文件,而不是组合的存储大小。此外,您还缺少按所有者用户名进行的分组。
  • @mklement0 我将“文件数量”解释为“文件的组合大小”。目前还不是很清楚。我还假设$folder 稍后将用于识别用户名(主目录)。
猜你喜欢
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多