首页 > 解决方案 > 在脚本中查找名称与正则表达式和当前日期匹配的文件

问题描述

我想在目录中查找最后一天的文件(即昨天:/daily-2019-11-26/photo-2019-11-26-15-processed.jpg应该匹配,/daily-2019-11-26/photo-2019-11-26-02-processed.jpg不应该匹配)。

如果我在终端中输入它,它会按预期工作

find /daily-$(date -d "-1 day" +%F)/photo-$(date -d "-1 day" +%F)-!(0[0-9])-*.jpg

#                                                                 ^ not 00-09 a.m. hours

但是当我像运行它时在脚本文件中不起作用bash script.sh

#!/bin/bash
find /daily-$(date -d "-1 day" +%F)/photo-$(date -d "-1 day" +%F)-!(0[0-9])-*.jpg

我收到错误:line 2: syntax error near unexpected token '('

怎么了?

最终我想每天用一个 cron 运行这个脚本

标签: regexbashshelldatefind

解决方案


我收到错误:line 2: syntax error near unexpected token '('怎么了?

添加shopt -s extglob您的script.sh文件以启用扩展模式匹配。

例如:

#!/bin/bash
shopt -s extglob
find /daily-$(date -d "-1 day" +%F)/photo-$(date -d "-1 day" +%F)-!(0[0-9])-*.jpg

为什么在终端中输入它时它可以工作,但输入失败script.sh

extglob被设置为on,因此扩展模式匹配部分,即!(0[0-9]),被正确解释。但是,您必须在每个.sh脚本文件中启用它,因为默认情况下它是关闭的。

顺便提一句。您可以shopt extglob在终端中键入以检查extglobon还是off


其他注意事项:

引用命令替换的:

尽管考虑到命令返回的值的格式并非完全必要),但请考虑在命令中date双引号替换find命令,如下所示:

#!/bin/bash
shopt -s extglob
find /daily-"$(date -d "-1 day" +%F)"/photo-"$(date -d "-1 day" +%F)"-!(0[0-9])-*.jpg

#           ^                       ^       ^                       ^

改为使用ls

您也可以使用ls代替获得相同的结果find(鉴于您的问题find实际上似乎没有必要):

例如:

#!/bin/bash
shopt -s extglob
ls /daily-"$(date -d "-1 day" +%F)"/photo-"$(date -d "-1 day" +%F)"-!(0[0-9])-*.jpg

重构

因为你在调用;date -d "-1 day" +%F两次你可以将它分配给一个变量,然后再引用它。这样做只会调用date一次命令。例如下面我们将昨天的日期分配给任意命名的变量yyyy_mm_dd_yesterday

  • 使用find

    #!/bin/bash
    shopt -s extglob
    yyyy_mm_dd_yesterday=$(date -d "-1 day" +%F)
    find /daily-"$yyyy_mm_dd_yesterday"/photo-"$yyyy_mm_dd_yesterday"-!(0[0-9])-*.jpg
    
  • 使用ls

    #!/bin/bash
    shopt -s extglob
    yyyy_mm_dd_yesterday=$(date -d "-1 day" +%F)
    ls /daily-"$yyyy_mm_dd_yesterday"/photo-"$yyyy_mm_dd_yesterday"-!(0[0-9])-*.jpg
    

附加说明:

您在 中定义的路径名script.sh,即读取的部分,/daily ...需要是相对于所在位置script.sh的路径名,或者是目录的绝对路径名。


推荐阅读