当前文件夹包含子文件夹,每个子文件夹都包含我要处理的文件。
我感兴趣的文件如下:
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
纳达。
答案 0 :(得分:1)
负扩展的glob模式有点问题。让我们稍微简化一下情况:我们想要*nice*
,但我们最后不想要ugly
。如果我们输入
*nice*!(ugly)
然后包含nice
的所有内容都将匹配:否定模式之前的星号也会占用u
,而最后的gly
不再是丑陋的。此外,以nice
结尾的字符串将不匹配。
要解决此问题,请将星号移到否定模式中:
*nice!(*ugly)
答案 1 :(得分:1)
使用find
:
find . -path "./someSubFolderCommonPathName*/*commonStringInFileName*" ! -name "*_stringNotToMatch" -exec stat {} \;