我在这里找到了这段代码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 中的模式*
不区分目录和文件,但zsh
shell 可以用来*(.)
修改模式的行为以仅匹配常规文件(用户zsh
可能会在上面和下面的非变体中使用2009*(.)
而不是)。2009*
find
使用**
in (与shopt -s globstar
in bash
、或set -o extended-glob
inyash
或任何其他可能支持它的 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