bash上的模式匹配用于macOS上的屏幕截图

bash上的模式匹配用于macOS上的屏幕截图,bash,macos,terminal,ls,glob,Bash,Macos,Terminal,Ls,Glob,我很难将一个globbing表达式与macOS上的屏幕截图文件名模式相匹配 我已经设法让以下正则表达式来完成这项工作: Screen Shot\d{4}-\d{2}-\d{2}at\d{2}\.\d{2}.\d{2}(\(\d+\)?\.png 此正则表达式匹配: Screen Shot 2017-04-04 at 23.11.22.png Screen Shot 2017-04-04 at 23.38.40 (2).png Screen Shot 2017-04-04 at 23.38.40

我很难将一个globbing表达式与macOS上的屏幕截图文件名模式相匹配

我已经设法让以下正则表达式来完成这项工作:

Screen Shot\d{4}-\d{2}-\d{2}at\d{2}\.\d{2}.\d{2}(\(\d+\)?\.png

此正则表达式匹配:

Screen Shot 2017-04-04 at 23.11.22.png
Screen Shot 2017-04-04 at 23.38.40 (2).png
Screen Shot 2017-04-04 at 23.38.40 (12).png
Screen Shot 2017-04-04 at 23.38.40 (12342).png
我得到的最接近的是以下内容,除了在同一秒拍摄的屏幕截图,里面有
(数字)
,其他内容都匹配:

Screen\Shot\[0-9][0-9][0-9][0-9]\-[0-9][0-9][0-9]\at\[0-9][0-9][0-9][0-9][0-9].[0-9][0-9]。png

我已经开始测试
*?\\([0-9]\).png,它可以工作,但我不能同时连接这两个表达式,因为一旦我这样做,结果是
没有这样的文件或目录

其想法是创建一个别名以删除所有屏幕快照,如:

alias clrss=“cd~/Desktop | rm-rf Screen\Shot*.png”
您尝试了以下方法:

alias clrss="cd ~/Desktop | rm -rf Screen\ Shot*.png"
这不起作用,因为
|
将一个命令的输出发送到下一个命令,而
用于分离顺序命令,因此
在那里工作:

alias clrss="cd ~/Desktop ; rm -rf Screen\ Shot*.png"
另外,
-r
用于删除目录及其内容,这是无用的,因为不会有任何名为
屏幕截图*.png的目录:

alias clrss="cd ~/Desktop ; rm -f Screen\ Shot*.png"
但该命令会将您留在桌面上,因此这样更好:

alias clrss="rm -f ~/Desktop/Screen\ Shot*.png"
但是,如果您担心匹配的
Screen\Shot*.png
太多,则可以使用更具体的模式,例如:

alias clrss="rm -f ~/Desktop/Screen\ Shot\ [0-9][0-9][0-9][0-9]\-[0-9][0-9]\-[0-9][0-9]\ at\ [0-9][0-9].[0-9][0-9].[0-9][0-9]*.png"
或者,如果这仍然过于笼统,您可以将
grep
perl
正则表达式和
xargs-rm
一起使用,如下所示:

alias clrss="find ~/Desktop -name \"Screen Shot *.png\" |
  grep -P 'Screen Shot \d{4}-\d{2}-\d{2} at \d{2}\.\d{2}\.\d{2}( \(\d+\))?\.png' |
  tr '\n' '\0' |
  xargs -r -0 rm -f"
从@alcanaia更新:在MacOS上,使用
grep-E
代替
grep-p
,使用
xargs-0
代替
xargs-r-0

@alcanaia更新2:这里有一个更好的正则表达式;它包括12h格式和一个边缘案例:

Screen Shot \d{4}-\d{2}-\d{2} at \d{1,2}\.\d{2}\.\d{2}( (AM|PM))?(( (\d)?\(\d+\))| \d)?\.png
你试过这个:

alias clrss="cd ~/Desktop | rm -rf Screen\ Shot*.png"
这不起作用,因为
|
将一个命令的输出发送到下一个命令,而
用于分离顺序命令,因此
在那里工作:

alias clrss="cd ~/Desktop ; rm -rf Screen\ Shot*.png"
另外,
-r
用于删除目录及其内容,这是无用的,因为不会有任何名为
屏幕截图*.png的目录:

alias clrss="cd ~/Desktop ; rm -f Screen\ Shot*.png"
但该命令会将您留在桌面上,因此这样更好:

alias clrss="rm -f ~/Desktop/Screen\ Shot*.png"
但是,如果您担心匹配的
Screen\Shot*.png
太多,则可以使用更具体的模式,例如:

alias clrss="rm -f ~/Desktop/Screen\ Shot\ [0-9][0-9][0-9][0-9]\-[0-9][0-9]\-[0-9][0-9]\ at\ [0-9][0-9].[0-9][0-9].[0-9][0-9]*.png"
或者,如果这仍然过于笼统,您可以将
grep
perl
正则表达式和
xargs-rm
一起使用,如下所示:

alias clrss="find ~/Desktop -name \"Screen Shot *.png\" |
  grep -P 'Screen Shot \d{4}-\d{2}-\d{2} at \d{2}\.\d{2}\.\d{2}( \(\d+\))?\.png' |
  tr '\n' '\0' |
  xargs -r -0 rm -f"
从@alcanaia更新:在MacOS上,使用
grep-E
代替
grep-p
,使用
xargs-0
代替
xargs-r-0

@alcanaia更新2:这里有一个更好的正则表达式;它包括12h格式和一个边缘案例:

Screen Shot \d{4}-\d{2}-\d{2} at \d{1,2}\.\d{2}\.\d{2}( (AM|PM))?(( (\d)?\(\d+\))| \d)?\.png

首先,感谢您的回复!不幸的是,您发布的最后一个命令不起作用,我得到了:
用法:grep[-abcdefghhijllmnooqrssuvvwxz][A num][B num][C[num]]xargs:非法选项--r[-e pattern][f file][--binary files=value][color=when]用法:xargs[-0opt e][-e eofstr I replst][-r replstr L number]…
我不是bash专家,但我注意到在参数方面存在一些差异,比如
--regexp
而不是
-P
,因此我怀疑我们在这里使用的工具版本不同。你能告诉我这件事吗?对不起,是的,我有Macports提供的GNU grep 3.0和GNU findutils xargs 4.6.0,而MacOS默认值是更旧、更糟糕的版本。我已经更新了答案以使用这些工具。PS:如果你对命令行有更多的了解,那么从长远来看,你会更乐意安装Macports(或自制),以便安装更新的
bash
grep
findutils
gawk
、和
gsed
(对于初学者)谢谢@webb,我已经能够把它放在一起了,只是做了一些改变:在
grep
中将
-P
更改为
-E
;在
xargs
中删除
-r
;改进了正则表达式,考虑了12h格式和截图的一些其他情况,在代码< >(x).png<代码>之前,得到了一些额外的数字,因此新正则表达式是“代码>屏幕截图\ d { 4 } \d { 2 } -d {2 }在\{{1,2} \ \{} } 2 } \d{2 }((AM(pm)))(((\d)\(d+\))\ d?\png< /代码>首先,谢谢回复!不幸的是,您发布的最后一个命令不起作用,我得到了:
用法:grep[-abcdefghhijllmnooqrssuvvwxz][A num][B num][C[num]]xargs:非法选项--r[-e pattern][f file][--binary files=value][color=when]用法:xargs[-0opt e][-e eofstr I replst][-r replstr L number]…
我不是bash专家,但我注意到在参数方面存在一些差异,比如
--regexp
而不是
-P
,因此我怀疑我们在这里使用的工具版本不同。你能告诉我这件事吗?对不起,是的,我有Macports提供的GNU grep 3.0和GNU findutils xargs 4.6.0,而MacOS默认值是更旧、更糟糕的版本。我已经更新了答案以使用这些工具。PS:如果你对命令行有更多的了解,那么从长远来看,你会更乐意安装Macports(或自制),以便安装更新的
bash
grep
findutils
gawk
、和
gsed
(对于初学者)谢谢@webb,我已经能够把它放在一起了,只是做了一些改变:在
grep
中将
-P
更改为
-E
;在
xargs
中删除
-r
;改进了ReGEX,考虑了一些其他的情况,比如12h格式和截图速度非常快,在(x)之前得到了一些额外的数字。