为什么'ls * [[::] *]'有效,而'ls * [[:: s *]] _ [[:digit:] *]'无效?

时间:2019-12-23 19:29:08

标签: bash glob

我修改了防火墙规则,并且ufw创建了更改文件的备份。我想确保我没有误删除某些内容,因此运行了以下内容:

$ ls *[[:digit:]*]_[[:digit:]*]
ls: cannot access '*[[:digit:]*]_[[:digit:]*]': No such file or directory

我也尝试过

$ ls *_[[:digit:]*]
ls: cannot access '*_[[:digit:]*]': No such file or directory

这里的下划线有什么问题?

最后,以下工作成功了。但这将匹配以任何数字结尾的任何文件。

$ ls *[[:digit:]*]
after6.rules.20191223_104857  after.rules.20191223_104857  before6.rules.20191223_104857  
before.rules.20191223_104857  user6.rules.20191223_104857  user.rules.20191223_104857

如果这有帮助,我的与glob相关的商店设置为

$ shopt | grep glob
dotglob         on
extglob         on
failglob        off
globasciiranges on
globstar        on
nocaseglob      on
nullglob        off

1 个答案:

答案 0 :(得分:2)

您假设[[:digit:]*]的意思是“零个或多个数字”。这不是真的。它匹配一个数字或星号。

您想要的是extglob *([[:digit:]])

~/tmp $ ls **([[:digit:]])_*([[:digit:]])
after.rules.20191223_104857   before.rules.20191223_104857  user.rules.20191223_104857
after6.rules.20191223_104857  before6.rules.20191223_104857 user6.rules.20191223_104857

~/tmp $ ls *_*([[:digit:]])
after.rules.20191223_104857   before.rules.20191223_104857  user.rules.20191223_104857
after6.rules.20191223_104857  before6.rules.20191223_104857 user6.rules.20191223_104857