我在这里找到了这段代码https://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html这很好地给了我目录中的文件数量。
ls -1 | wc -l
但我只想知道这些文件中有多少以 2009 开头(例如20091210_005037.nc
)。
我试过ls -1 | wc -l 2009*
了,但这会慢慢列出所有文件,似乎没有给我一个数字。
我在这里找到了这段代码https://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html这很好地给了我目录中的文件数量。
ls -1 | wc -l
但我只想知道这些文件中有多少以 2009 开头(例如20091210_005037.nc
)。
我试过ls -1 | wc -l 2009*
了,但这会慢慢列出所有文件,似乎没有给我一个数字。
这会将位置参数列表(
$1
、$2
、 ... 等)设置为匹配的名称2009*
。这个列表的长度是$#
。问题
ls -1 | wc -l 2009*
是您wc -l
直接在匹配的文件上执行2009*
,计算每个文件中的行数。同时,ls -1
正在尝试写入 的标准输入wc
,wc
因为它被给出了一个明确的文件列表来处理,所以它没有读取。您可能想使用
ls -d 2009* | wc -l
. 这将列出所有匹配的名称2009*
(使用ls
with-d
不列出目录的内容),并计算输出中的行数。请注意,-1
如果您通过管道传输某处的结果,则不需ls
要这样做(除非ls
是强制列输出的别名或 shell 函数)。另请注意,如果任何文件名包含换行符,这会给您错误的计数:
然而:
(在大多数 shell 中使用
set
和输出$#
另外不使用任何外部命令)用于递归
find
计数:在这里,我们为当前目录中或当前目录下的每个找到的路径名输出一个点,然后我们计算它产生的行数。我们不计算文件名字符串本身,而是这样做以避免在文件名包含换行符时计算太多行。
find
我们能够更密切地控制我们计算的文件类型。上面,我们明确地测试了常规文件(-type f
即不是目录和其他类型的文件)。shell 中的*
模式不区分目录和文件,但是zsh
shell 可以*(.)
用来修改模式的行为以仅匹配常规文件(zsh
用户可能会使用2009*(.)
而不是在上面和下面2009*
的非变体中)。find
使用
**
in (withshopt -s globstar
inbash
, orset -o extended-glob
inyash
, or in any other shell that may support it), 递归计数:该模式
**
几乎匹配*
,但也匹配/
路径名。尝试使用以下命令,它工作正常并得到了结果
注意:如果你想在子目录下也请删除 maxdepth 选项
感谢评论中的人,这是我问题的答案:
或使用查找
使用 awk 计算以特定文件名开头的文件数。