Bash模式匹配:排除给定的字符串

时间:2013-04-30 09:28:27

标签: bash file pattern-matching

当前文件夹包含子文件夹,每个子文件夹都包含我要处理的文件。

我感兴趣的文件如下:

someSubFolderCommonPathName*/*commonStringInFileName*

我的问题是我还有要处理的文件,其名称与上述相同,以_stringNotToMatch结尾:

someSubFolderCommonPathName*/*commonStringInFileName*_stringNotToMatch

如何在模式匹配表达式中排除

一个简单的例子可能是:

for i in someSubFolderCommonPathName*/*commonStringInFileName*!(stringNotToMatch); do stat $i; done

......但它不起作用。

好的,如果我进一步简化这个,这是一个例子: 我有以下内容:

me@my-laptop:~/a$ ls -R
.:
aPrettyBoy  aPrettyGirl

./aPrettyBoy:
12cool21  12nice21  77nice77_ugly

./aPrettyGirl:
12cool21  12nice21  23nice23_ugly

然后我尝试在名称中显示包含nice的所有文件,而不是_ugly

me@my-laptop:~/a$ for i in *Pretty*/*nice*!(_ugly); do echo $i; done
aPrettyBoy/12nice21
aPrettyBoy/77nice77_ugly
aPrettyGirl/12nice21
aPrettyGirl/23nice23_ugly

它不起作用。我现在要包括一个明星:

me@my-laptop:~/a$ for i in *Pretty*/*nice*!(*_ugly); do echo $i; done
aPrettyBoy/12nice21
aPrettyBoy/77nice77_ugly
aPrettyGirl/12nice21
aPrettyGirl/23nice23_ugly

仍然无法正常工作。 NOW与find

me@my-laptop:~/a$ find . -path "*Pretty*/*nice*" ! -name "_ugly" -exec echo {} \;
./aPrettyBoy/12nice21
./aPrettyBoy/77nice77_ugly
./aPrettyGirl/23nice23_ugly
./aPrettyGirl/12nice21

纳达。

2 个答案:

答案 0 :(得分:1)

负扩展的glob模式有点问题。让我们稍微简化一下情况:我们想要*nice*,但我们最后不想要ugly。如果我们输入

*nice*!(ugly)

然后包含nice的所有内容都将匹配:否定模式之前的星号也会占用u,而最后的gly不再是丑陋的。此外,以nice结尾的字符串将不匹配。

要解决此问题,请将星号移到否定模式中:

*nice!(*ugly)

答案 1 :(得分:1)

使用find

find . -path "./someSubFolderCommonPathName*/*commonStringInFileName*" ! -name "*_stringNotToMatch" -exec stat {} \;