【问题标题】:Pattern matching on bash for screen shots on macOSbash 中用于 macOS 屏幕截图的模式匹配
【发布时间】:2017-08-30 11:48:16
【问题描述】:

我很难尝试组合一个通配符来匹配 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"

【问题讨论】:

    标签: bash macos terminal ls glob


    【解决方案1】:

    你试过这个:

    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"
    

    或者,如果这仍然太笼统,您可以将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
    

    【讨论】:

    • 首先感谢您的回复!不幸的是,您发布的最后一个命令不起作用,我得到:usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]] xargs: illegal option -- r [-e pattern] [-f file] [--binary-files=value] [--color=when] usage: xargs [-0opt] [-E eofstr] [-I replstr [-R replacements]] [-J replstr] [-L number] ... 我不是 bash 专家,但我注意到参数上有一些差异,例如 --regexp 而不是 -P 所以我怀疑我们'在这里重新使用不同版本的工具。你能就这件事告诉我吗?
    • 抱歉,是的,我有来自 Macports 的 GNU grep 3.0 和 GNU findutils xargs 4.6.0,而 MacOS 的默认版本是旧的、更糟糕的版本。我已经更新了使用这些工具的答案。 PS:如果您对命令行有更多了解,从长远来看,安装 Macports(或 Homebrew)以安装更新的 bashgrepfindutilsgawk 和 @ 会更快乐987654348@(初学者)。
    • 谢谢@webb 我已经能够把它放在一起只是改变一些事情:将grep中的-P更改为-E;删除了xargs 中的-r;改进了正则表达式以考虑其他一些情况,例如 12 小时格式和非常快速拍摄的屏幕截图,导致 (x).png 之前的一些额外数字,所以新的正则表达式是 Screen Shot \d{4}-\d{2}-\d{2} at \d{1,2}\.\d{2}\.\d{2}( (AM|PM))?(( (\d)?\(\d+\))| \d)?\.png
    猜你喜欢
    • 1970-01-01
    • 2019-10-06
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2012-12-20
    • 1970-01-01
    相关资源
    最近更新 更多