在bash中查找文本文件

在bash中查找文本文件,bash,unix,scripting,Bash,Unix,Scripting,我在一个目录下的多个目录中有一堆电子邮件作为文本文件。我正在尝试编写一个脚本,其中我将键入一个日期作为3个单独的命令行参数,如下所示: findemail 2015 20 04 格式为yyyy/dd/mm,它将显示当天发送的电子邮件的所有文件名。但是我不确定从哪里开始。我想我可能会使用find,但我对脚本还不熟悉,所以我不确定。任何帮助都将不胜感激 电子邮件中的时间戳如下所示: TimeStamp:02/01/2004 11:19:02(格式仍与输入相同)最简单的方法是使用搜索工具,如gre

我在一个目录下的多个目录中有一堆电子邮件作为文本文件。我正在尝试编写一个脚本,其中我将键入一个日期作为3个单独的命令行参数,如下所示:

findemail 2015 20 04 
格式为yyyy/dd/mm,它将显示当天发送的电子邮件的所有文件名。但是我不确定从哪里开始。我想我可能会使用find,但我对脚本还不熟悉,所以我不确定。任何帮助都将不胜感激

电子邮件中的时间戳如下所示:


TimeStamp:02/01/2004 11:19:02
(格式仍与输入相同)

最简单的方法是使用搜索工具,如
grep
。Grep有一个非常有用的递归选项,允许在目录(和子目录)中的所有文件中搜索易于使用的字符串

假设在名为
timestamp
的变量中有时间戳,则会返回包含时间戳的文件名列表:

grep -lr $timestamp /Your/Main/Directory/Goes/Here
编辑:为了澄清,这只会搜索准确的字符串,因此它需要与搜索文本中的格式完全相同

grep -lr "$(printf "^TimeStamp: %02i/%02i/%04i" "$2" "$1" "$3")" path/to/directory
正则表达式查找mm/dd/yyyy;如果您想要更合理的欧洲日期顺序,请交换
$1
$2
的顺序

命令替换
$(command…
运行
command…
,并将其输出替换到包含命令替换的命令行中。因此,我们使用运行
printf
的子shell来创建
grep
的regex参数


-l
选项表示列出匹配文件的名称;
-r
选项表示递归遍历一组目录。(如果您的
grep
太过平庸,无法使用
-r
选项,那么就不难编造一个
表达式来找到与此相同的表达式。请参见示例)

谢谢。如果他们每次输入1,我将如何处理?(而不是2014 01 01)最简单的方法是一次提示用户每个零件一次。所以一年一次,一个月一次,一天一次。然后检查以确保月份中包含两个字符,如下所示:lengthofmonthstring=${#monthinputvar}如果lengthofmonthstring不是2,请再次询问用户。通过这种方式,还可以确保用户以正确的格式键入所有内容(即不将月份放在日期的前一天)。我想您可以使用
时间戳:
作为占位符,表示在常规标准电子邮件中确实发生的事情。
日期:
标题将是您的首选,但由于恶意(垃圾邮件发送者)或不称职(垃圾邮件发送者和其他人),此标题有时会包含邮件实际提交日期以外的内容。