Regex 在grep中使用find不隔离文件
我有一系列文件,如下所示:Regex 在grep中使用find不隔离文件,regex,grep,find,Regex,Grep,Find,我有一系列文件,如下所示: image-seq 2020-04-13-05-50-00.jpg image-seq 2020-04-13-06-00-00.jpg ... image-seq 2020-04-13-16-50-00.jpg image-seq 2020-04-13-17-00-00.jpg 我试图将时间从17:00到第二天05:50的文件分开(因此只返回示例中的第一个和最后一个文件名)。我想我可以使用find和grep来隔离文件,然后mv它们,但是不应该出现的文件会显示在结果
image-seq 2020-04-13-05-50-00.jpg
image-seq 2020-04-13-06-00-00.jpg
...
image-seq 2020-04-13-16-50-00.jpg
image-seq 2020-04-13-17-00-00.jpg
我试图将时间从17:00到第二天05:50的文件分开(因此只返回示例中的第一个和最后一个文件名)。我想我可以使用find和grep来隔离文件,然后mv
它们,但是不应该出现的文件会显示在结果输出中
我正在使用macOS grep,所以我不确定这是否是问题所在
我尝试的命令是:
find . -type f -name \*.jpg -exec grep -E '\-1[7-9]|2[0-3]|0[0-5]-\d{2}-\d{2}\.jpg' {} \;
我不确定我做错了什么,但如果你有任何建议,那就太好了。不要使用-exec grep
在文件中搜索,而是使用管道查找查找| grep
在打印的文件名列表中搜索
然后,您还必须调整正则表达式。使用-a | b | c-
可以搜索-a
、b
或c-
。您可能指的是搜索-a-
、-b-
或-c-
的-a-
find . -type f -name \*.jpg | grep -E -e'-(1[7-9]|2[0-3]|0[0-5])-..-..\.jpg'
然而,为fitlering数字范围编写正则表达式是一件累人且容易出错的事情。您可能知道,上面的正则表达式不检查分钟数。您可能需要切换到awk
:
find . -type f -name \*.jpg | awk -F- '$5>=17 || $5<5 || $5==5 && $6<=50'
find-键入f-name\*.jpg | awk-f-'$5>=17 | | |$5,而不是使用-exec grep
在文件内搜索使用管道查找| grep
打印的文件名列表
然后,您还必须调整正则表达式。使用-a | b | c-
可以搜索-a
、b
或c-
。您可能指的是搜索-a-
、-b-
或-c-
的-a-
find . -type f -name \*.jpg | grep -E -e'-(1[7-9]|2[0-3]|0[0-5])-..-..\.jpg'
然而,为fitlering数字范围编写正则表达式是一件累人且容易出错的事情。您可能知道,上面的正则表达式不检查分钟数。您可能需要切换到awk
:
find . -type f -name \*.jpg | awk -F- '$5>=17 || $5<5 || $5==5 && $6<=50'
find-在macOSfind
上键入f-name\*.jpg | awk-f-'$5>=17 | |$5,您可以使用此命令使用-E
和-iregex
选项获取匹配的文件:
find-E-iregex.*(-1[7-9]| 2[0-3]| 0[0-5])([0-9]{2}{2}\.jpg'
/图seq 2020-04-13-05-50-00.jpg
/图seq 2020-04-13-17-00-00.jpg
在macOS上find
您可以使用此命令使用-E
和-iregex
选项获取匹配的文件:
find-E-iregex.*(-1[7-9]| 2[0-3]| 0[0-5])([0-9]{2}{2}\.jpg'
/图seq 2020-04-13-05-50-00.jpg
/图seq 2020-04-13-17-00-00.jpg
grep
搜索文件的内容,而不是名称;您希望-regex
选项查找
(但请注意,它会查找整个路径的匹配项,包括开头的“/”。@GordonDavisson:有趣的是,我想grep也可以找到文件名,很高兴知道!所以我只需要把它包括在发现中,我就准备好了?谢谢grep
可以查找文件名,但前提是将文件名列表格式化为文件,并告诉它搜索该文件。你可以用find-打印| grep'somepattern'
(注意,在这种情况下,文件名文件不是存储为磁盘文件,而是通过管道直接从find
的输出传递到grep
的输入)。但是查找-exec grep…
将文件名作为参数传递给grep
,这意味着grep
将把它们解释为应该搜索其内容的文件名。grep
搜索文件的内容,而不是文件名;您希望-regex
选项查找
(但请注意,它会查找整个路径的匹配项,包括开头的“/”。@GordonDavisson:有趣的是,我想grep也可以找到文件名,很高兴知道!所以我只需要把它包括在发现中,我就准备好了?谢谢grep
可以查找文件名,但前提是将文件名列表格式化为文件,并告诉它搜索该文件。你可以用find-打印| grep'somepattern'
(注意,在这种情况下,文件名文件不是存储为磁盘文件,而是通过管道直接从find
的输出传递到grep
的输入)。但是查找-exec grep…
将文件名作为参数传递给grep
,这意味着grep
将把它们解释为应该搜索其内容的文件名。谢谢,它工作得很好,但我必须在regex\-(1…
中添加转义符,否则我会得到grep:invalid选项--(
awk
也很有趣…谢谢你听到这个消息很高兴。谢谢你的反馈。在grep
中,正确的方法是-e
。谢谢,它工作得很好,但是我必须在regex\-(1…
中添加一个转义符,否则我会得到grep:invalid option--(
awk
也很有趣…谢谢你听到这个消息很高兴。谢谢你的反馈。在grep
中摆脱领先的-
的正确方法是-e
。谢谢你,它成功了!:)很高兴知道它成功了,谢谢你,它成功了!:)很高兴知道它成功了,