Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在grep中使用find不隔离文件_Regex_Grep_Find - Fatal编程技术网

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-在macOS
find
上键入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
。谢谢你,它成功了!:)很高兴知道它成功了,谢谢你,它成功了!:)很高兴知道它成功了,