shell - 查找包含字符串出现次数的文件

标签 shell unix grep

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

2012 年 11 月将表示为“1211”。使用下面文件名中第二个句点之后的前四个字符,这将使我们命中第一个文件名(“o.tt.121113150804”),因为它与该模式匹配。我会计算该文件的数量,然后不理会其他两个文件。

下面的文件只是一个示例。它们可以用多种不同的方式命名。它们通常只是 99% 以下时间的变体。事实上,有 2 个句点,我需要检查第 2 个句点之后的 4 位数字,但这是一个确定的常数。

我需要检查的文件名:

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

最佳答案

这可以单独使用 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

关于shell - 查找包含字符串出现次数的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13884349/

相关文章:

linux - 用于计数文件的 Shell 脚本,然后删除最旧的文件

linux - 通过 shell 脚本发送推文到 Twitter

c - 检查网站是否在 Perl 或 C 中的最快方法是什么?

linux - Crontab - 如何让脚本从 12 :00 PM to 03:00 AM 每 15 分钟运行一次

bash - 如何仅将匹配 grep 的行存储到变量

linux - 如何获取进程 ID 以杀死 nohup 进程?

linux - 如何在 bash 脚本中引用变量

linux - 在 linux 中更改符号链接(symbolic link)的目标而不更改其名称

java - 如何使用所有的Unix环境变量?

regex - 可以为模式 grep 文件,然后根据模式的一部分对找到的行进行排序吗?