regex - 在脚本中查找名称与正则表达式和当前日期匹配的文件
问题描述
我想在目录中查找最后一天的文件(即昨天:/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 运行这个脚本
解决方案
我收到错误:
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
在终端中键入以检查extglob
是on
还是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
的路径名,或者是目录的绝对路径名。
推荐阅读
- c# - 有没有办法可以访问由其他设备上的另一个应用程序保存的 Android 应用程序中的文件?
- php - 使用 {{ }} 时的 Laravel 5.6 htmlspecialchars
- angularjs - 如何为angularJS中的嵌套for循环实现nginfiniteScroll
- azure - 创建新的逻辑应用模板
- javascript - 如何内联(链式调用)JavaScript es6对类方法进行多次调用
- entity-framework-core - 对需要使用 DbQuery 的测试服务的建议
- 实体框架核心 2.1 - InMemory - graphql - 如何使用 GraphQLError 自定义消息传递?
- cefsharp - 如何在 Cefsharp Offscreen 中禁用声音
- excel - VBA:带有“选择案例”的着色图表系列
- python - python3 - 按元素扩展字符串列表