我正在尝试确定如何匹配文件app1.js,app2.js,但不 app-foo-1.js在目录中。目前,我的bash脚本中包含以下内容:
for d in /home/chambres/web/x.org/public_html/2018/js/app*.js ; do
filename="${d##*/}"
echo "$d"
echo "$filename"
echo " "
done
这与它们匹配-但也与app-whatever.js匹配
如何将其缩小为我想要的?我敢肯定它很简单,但我只是从在线教程中获取代码,因为我不是bash程序员=)
谢谢
答案 0 :(得分:4)
似乎您正在寻找extglob,它等效于正则表达式,不像ERE那样方便或不像PCRE那样具有表达能力,但可以完成工作
shopt -s extglob
for d in file+([0-9]).js ; do
...
其中file
必须以适当的模式进行更改,是从标题中摘录的。
来自Pattern matching in Bash Manual
如果使用内置的shopt启用了extglob shell选项,则会识别出几个扩展的模式匹配运算符。在以下描述中,模式列表是一个或多个由“ |”分隔的模式的列表。可以使用以下一个或多个子图案来形成复合图案:
?(模式列表)
Matches zero or one occurrence of the given patterns.
*(样式列表)
Matches zero or more occurrences of the given patterns.
+(样式列表)
Matches one or more occurrences of the given patterns.
@(模式列表)
Matches one of the given patterns.
!(模式列表)
Matches anything except one of the given patterns.
答案 1 :(得分:2)
您可以使用series: [{
pointStart: Date.UTC(2010, 0, 1),
pointIntervalUnit: 'month',
data: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
}]
命令根据所需模式搜索文件,并使用find
参数对每个结果执行命令:
-exec
上面的命令将在每个匹配的搜索结果上执行find /home/chambres/web/x.org/public_html/2018/js/ \
-type f \
-regex '.*app[0-9]+.js' \
-exec ls -la {} \;
。
答案 2 :(得分:0)
for d in app[0-9].js; do echo $d; done
或用多个数字解决问题:
find $path -regextype egrep -regex '.*/app[0-9]+.js'
您可以使用-exec
传递命令:
find $path -regextype egrep -regex '.*/app[0-9]+.js' -exec ls -l {} \;
答案 3 :(得分:0)
请尝试以下操作:
find /home/chambres/web/x.org/public_html/2018/js -iregex '.*\/app[0-9]*\.js'
完整的示例:
cd /home/chambres/web/x.org/public_html/2018/js
for file in $(find . -iregex '.*\/app[0-9]*\.js')
do
echo $file
done
答案 4 :(得分:-1)
您也可以使用grep来实现,它可以匹配一个或多个数字:
find /home/chambres/web/x.org/public_html/2018/js/ -type f | grep "app[0-9]\+"
,如果您必须对这些文件执行命令:
for file in $(find /home/chambres/web/x.org/public_html/2018/js/ -type f | grep "app[0-9]\+"); do
echo $file;
done;