我正在运行一个bash脚本,如下所示:
n=`ls /tmp/abc/*-(2|3).20150406.txt | wc -l`;
但它在此行说出语法错误 命令替换:第1行意外令牌`('
相同的命令在没有控制台上的脚本的情况下运行正常。我在这里遗漏了什么。任何帮助将不胜感激。
答案 0 :(得分:1)
假设您要匹配此文件名模式:
<anything><dash><2 or 3><anything><20150406.txt>
例如,匹配:
file-2.20150406.txt
file-3.20150406.txt
run-29.20150406.txt
但不是:
file-4.20150406.txt
run-29.20150406
以下应该可以解决问题:
#!/bin/bash
n=`find /tmp/abc -regex ".*-[23].*20150406.txt" | wc -l`
echo $n
一般来说,find
比ls
更适合regexen。
答案 1 :(得分:1)
您需要在此处使用extglob
来匹配几个选定的数字,如下所示:
shopt -s extglob
printf "%s\n" /tmp/abc/*-@(2|3|29).20150406.txt
它将打印:
/tmp/abc/run-2.20150406.txt
/tmp/abc/run-29.20150406.txt
/tmp/abc/run-3.20150406.txt
计算它们:
printf "%s\n" /tmp/abc/*-@(2|3|29).20150406.txt | wc -l