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

Pattern matching on bash for screen shots on macOS

我很难尝试组合一个 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

我得到的最接近的是以下内容,它匹配除同时拍摄的屏幕截图之外的所有内容,其中包含 (number) 的内容:

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

我已经开始测试 *?\ \([0-9]\).png 并且它有效,但我无法加入两个表达式,因为一旦我加入,结果是 no such file or directory

想法是创建一个别名来删除所有屏幕截图,例如:

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 用于删除目录及其内容,这是无用的,因为不会有任何名为 Screen Shot*.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"

或者,如果这仍然太笼统,您可以将 grepperl 正则表达式和 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' '[=15=]' |
  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