2012-12-14 24 views
2

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

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

以下文件只是一个示例。他们可以用许多不同的方式命名。他们通常只是99%以下时间的变化。事实上有两个时期,我需要检查第二个之后的4位数字是一个固定的常数。

文件名,我需要检查:

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

如何是一个bash的问题吗? – melpomene

回答

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

有可能是一个小问题,这似乎是检测文件名称中的单个点名称像“a.12111231”,该操作似乎是在寻找文件第二''。这个'找到。 -maxdepth 1 -type f -iname“*。*。1211 *”'似乎在工作。请看看 –

+0

@ another.anon.coward的好处,不要认为区分大小写是必需的,所以'-name'就够了,但为了防万一,我把它留下了。感谢您的建议。 –

+0

无论我们有什么味道的贝壳都不喜欢maxdepth或iname。但我可以解决这个问题。这很好。我非常感谢你的帮助。 – user295197

1

注意模式*.*.1211*将匹配文件用两个以上的点之前的固定字符串。例如,a.b.c.1211将匹配。

使用bash,你可以这样写:

shopt -s extglob 
ls +([^.]).+([^.]).1211* 

如果你只是想指望他们:

files=(+([^.]).+([^.]).1211*) 
echo "${#files[@]} files matched" 
0

@sudo_O和@glennjackman回答你的问题,但是,如果你想获得计数替代所有日期的同时,你可以做

ls | awk -F'.' '{count[substr($3,1,4)]++} END{for (date in count) print date, count[date]}' 
相关问题