我正在尝试编写一个.sh
脚本,在某个时刻它会检查当前目录中是否有一个或多个文件与*\_??\_??\_64kbs.mp3
匹配
或者,使用正则表达式^.*\_..\_..\_64kbs\.mp3$
这是对命令的一次尝试:
if [ 'ls *_??_??_64kbs.mp3 2>/dev/null | wc -l ' == 0 ];
then echo "nothing";
else echo "something";
fi
我知道
'ls *_??_??_64kbs.mp3 2>/dev/null | wc -l'
在这种情况下只返回终端的数字9,因为有9个匹配。如果我删除第一个'?',它会返回0,就像它应该一样,因为没有与该表达式匹配的文件名。但上面if表达式的输出总是“某事”。
编辑: 有人要求为我想要匹配的内容提供完整的示例文件名。这是一个:
George-1983_1A_01_64kbs.mp3
答案 0 :(得分:1)
你显然对 glob 与 regex 匹配感到困惑,*
是一个纯粹的glob结构,可以在循环中使用,如下所示
fileNamePattern="*_??_??_64kbs.mp3"
for file in *.mp3; do
[[ $file == $fileNamePattern ]] && echo "$file matches"
done
?
和*
的含义在regex
上下文中使用时有所不同,我们使用.*
来匹配部分和.{}
表示任何可能由{}
内的值决定出现的角色,例如,
fileNameRegex=".*_.{2}_.{2}_64kbs.mp3"
for file in *.mp3; do
[[ $file =~ $fileNameRegex ]] && echo "$file matches"
done
~
是bash
正则表达式运算符(从bash
版本4.0
开始支持)您需要匹配正则表达式而不是水珠
答案 1 :(得分:-1)
我找到了一个似乎有效的解决方案。用$()而不是引号包装命令。
if [ $(ls *_??_??_64kbs.mp3 2>/dev/null | wc -l) == 0 ];
then echo "nothing";
else echo "something";
fi
我之前尝试过这样的事情但它似乎没有用,但肯定会出现语法错误。在这种情况下,它正在运作。