查找包含字符串出现的文件

时间:2012-12-14 18:30:50

标签: shell unix grep

我的任务之一是计算与特定日期模式匹配的文件数。我真正需要做的是遍历目录,检查每个文件名,找到该文件名中的第二个句点,然后检查接下来的4个字符,看看我正在组装的日期字符串是否匹配。

2012年11月将被表示为“1211”。在下面的文件名中使用第二个句点之后的前四个字符,这将使我们在第一个文件名(“o.tt.121113150804”)上点击,因为它匹配该模式。我会计算那个文件,然后单独留下另外两个。

以下文件只是一个示例。它们可以用许多不同的方式命名。它们通常只是99%以下的变化。事实上,有2个时期,我需要检查第2个后的4个数字是一个明确的常数。

我需要检查的文件名:

o.tt.121113150804
o.stpw.101209092541
i.rtat.120831045704

3 个答案:

答案 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]}'