计算目录中具有特定名称的文件数

计算目录中具有特定名称的文件数

我在这里找到了这段代码https://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html这很好地给出了我的目录中的文件数量。

ls -1 | wc -l

但我只想知道其中有多少文件名以 2009 开头(例如20091210_005037.nc)。

我尝试过ls -1 | wc -l 2009*,但它慢慢地列出了所有文件,并且似乎没有给我一个数字。

答案1

set -- 2009*
echo "$#"

这会将位置参数列表($1$2、 ... 等)设置为匹配的名称2009*。这个列表的长度是$#


问题ls -1 | wc -l 2009*是您wc -l直接在匹配的文件上执行2009*,计算每个文件中的行数。同时,ls -1正在尝试写入 的标准输入wc,但它wc不会从中读取,因为它被赋予了要处理的显式文件列表。

您可能想要使用ls -d 2009* | wc -l。这将列出所有匹配的名称2009*(使用ls-d列出目录的内容),并计算输出中的行数。请注意,-1如果您将 的结果通过管道传输到某处,则不需要ls(除非ls是强制列输出的别名或 shell 函数)。

另请注意,这将为您提供错误的计算任何文件名是否包含换行符:

$ touch '2009
> was
> a
> good
> year'
$ ls
2009?was?a?good?year
$ ls -l
total 0
-rw-r--r--  1 kk  wheel  0 May 28 11:09 2009?was?a?good?year
$ ls -1
2009?was?a?good?year
$ ls | wc -l
       5
$ ls -1 | wc -l
       5

然而:

$ set -- 2009*
$ echo "$#"
1

(在大多数 shell 中另外使用set和输出$#不使用任​​何外部命令)


使用find递归计数:

find . -type f -name '2009*' -exec echo . \; | wc -l

在这里,我们为当前目录中或下的每个找到的路径名输出一个点,然后计算它产生的行数。我们不计算文件名字符串本身,而是这样做以避免在文件名包含换行符时计算太多行。

我们find能够更密切地控制类型我们计算的文件数量。上面,我们明确测试了常规文件-type f(即不是目录和其他类型的文件)。 shell 中的模式*不区分目录和文件,但zshshell 可以用来*(.)修改模式的行为以仅匹配常规文件(用户zsh可能会在上面和下面的非变体中使用2009*(.)而不是)。2009*find

使用**in (与shopt -s globstarin bash、或set -o extended-globinyash或任何其他可能支持它的 shell 一起)进行递归计数:

set -- **/2009*
echo "$#"

该模式**几乎与 like 匹配*,但也与路径名交叉匹配/

答案2

尝试使用以下命令,效果很好并得到了结果

   find . -maxdepth 1 -type f -iname "2009*" | awk '{print NR}'| sed -n '$p'

注意:如果您想在子目录下也请删除 maxdepth 选项

答案3

感谢评论中的人,这就是我的问题的答案:

ls 2009* | wc -l

或使用查找

find 2009* | wc -l

答案4

使用 awk 计算以特定文件名开头的文件数量。

root@ubuntu$ find . -name "2009*" | awk 'BEGIN{total=0}; {total=total+1} END {print "total files starting with 2009 is " ,total}'
total files starting with 2009 is  4

相关内容