1

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

我感兴趣的文件如下所示:

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

还是行不通。现在有了find

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

纳达。

4

2 回答 2

1

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

*nice*!(ugly)

然后包含的所有内容都nice将匹配:否定模式之前的星号也吃掉了ugly最后的 the 不再丑陋了。此外,以 结尾的字符串nice将不匹配。

要解决方法,请将星号移动到否定模式中:

*nice!(*ugly)
于 2013-04-30T09:33:48.073 回答
1

使用find

find . -path "./someSubFolderCommonPathName*/*commonStringInFileName*" ! -name "*_stringNotToMatch" -exec stat {} \;
于 2013-04-30T09:40:27.957 回答