我的任务之一是计算与特定日期模式匹配的文件数。我真正需要做的是遍历目录,检查每个文件名,找到该文件名中的第二个句点,然后检查接下来的4个字符,看看我正在组装的日期字符串是否匹配。
2012年11月将被表示为“1211”。在下面的文件名中使用第二个句点之后的前四个字符,这将使我们在第一个文件名(“o.tt.121113150804”)上点击,因为它匹配该模式。我会计算那个文件,然后单独留下另外两个。
以下文件只是一个示例。它们可以用许多不同的方式命名。它们通常只是99%以下的变化。事实上,有2个时期,我需要检查第2个后的4个数字是一个明确的常数。
我需要检查的文件名:
o.tt.121113150804
o.stpw.101209092541
i.rtat.120831045704
答案 0 :(得分:4)
这可以单独使用ls
完成,但这也会匹配目录:
$ ls
i.rtat.120831045704 o.stpw.101209092541 o.tt.121113150804
$ ls *.*.1121*
o.tt.121113150804
但是find
更强大,更灵活:
$ find . -maxdepth 1 -type f -iname "*.*.1211*"
./o.tt.121113150804
选项:
-maxdepth 1
只能查看此目录。
-type f
只查找文件,而不是目录。
-iname
使用模式匹配*
匹配任何内容的文件名,以便*.*.1211*
匹配后跟.
后跟任何内容后跟第二个.
的内容按日期字符串和*
其他任何内容。
修改强>
要计算可以传输到wc -l
的匹配数,并使用命令替换$(...)
将值存储在变量中:
$ ls
i.rtat.120831045704 o.stpw.101209092541 o.tt.121113150804
o.tt.121113150804c1 o.tt.121113150804c2
$ find . -maxdepth 1 -type f -iname "*.*.1211*" | wc -l
3
$ found=$(find . -maxdepth 1 -type f -iname "*.*.1211*" | wc -l)
$ echo $found
3
答案 1 :(得分:1)
请注意,模式*.*.1211*
将匹配固定字符串前两个以上的文件。例如,a.b.c.1211
将匹配。
使用bash,你可以写:
shopt -s extglob
ls +([^.]).+([^.]).1211*
如果你只想数数:
files=( +([^.]).+([^.]).1211* )
echo "${#files[@]} files matched"
答案 2 :(得分:0)
@sudo_O和@glennjackman回答了您的问题,但如果您想立即获得所有日期的计数
ls | awk -F'.' '{count[substr($3,1,4)]++} END{for (date in count) print date, count[date]}'