2013-04-30 4 views
1

Текущая папка содержит вложенные папки, каждая из которых содержит среди других файл, который я хочу обработать.Соответствие шаблону: исключить заданную строку

Файлы Я заинтересован в выглядеть:

someSubFolderCommonPathName*/*commonStringInFileName* 

Моя проблема заключается в том, что у меня есть файлы, которые я сделать не хотите обработать чье имя такое же, как и выше, и которые заканчиваются _stringNotToMatch:

someSubFolderCommonPathName*/*commonStringInFileName*_stringNotToMatch 

Как исключить их в моих выражениях картины?

Простой пример может быть:

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

... но она не работает.

Хорошо, если я furtherly упростить это, вот пример: У меня есть следующие:

[email protected]:~/a$ ls -R 
.: 
aPrettyBoy aPrettyGirl 

./aPrettyBoy: 
12cool21 12nice21 77nice77_ugly 

./aPrettyGirl: 
12cool21 12nice21 23nice23_ugly 

И тогда я пытаюсь сделать показать все файлы, содержащие nice в их именах, а не _ugly:

[email protected]:~/a$ for i in *Pretty*/*nice*!(_ugly); do echo $i; done 
aPrettyBoy/12nice21 
aPrettyBoy/77nice77_ugly 
aPrettyGirl/12nice21 
aPrettyGirl/23nice23_ugly 

Это не сработало. Сейчас я включу звезду:

[email protected]:~/a$ for i in *Pretty*/*nice*!(*_ugly); do echo $i; done 
aPrettyBoy/12nice21 
aPrettyBoy/77nice77_ugly 
aPrettyGirl/12nice21 
aPrettyGirl/23nice23_ugly 

Все еще не работает. ТЕПЕРЬ С find:

[email protected]:~/a$ find . -path "*Pretty*/*nice*" ! -name "_ugly" -exec echo {} \; 
./aPrettyBoy/12nice21 
./aPrettyBoy/77nice77_ugly 
./aPrettyGirl/23nice23_ugly 
./aPrettyGirl/12nice21 

Нада.

ответ

1

Отрицательный расширенный шаблон глобуса немного проблематичен. Давайте немного упростим ситуацию: мы хотим *nice*, но мы не хотим ugly в конце. Если мы вступаем

*nice*!(ugly) 

тогда все, содержащий nice будет соответствовать: звездочка перед отрицательным рисунком ест u, а также, и gly в конце не безобразно больше. Более того, строки, заканчивающиеся на nice, не будут совпадать.

Чтобы решить эту проблему, переместите звездочку в отрицательной схеме:

*nice!(*ugly) 
+0

В моем случае часть до и после 'nice' всегда меняется. Единственные константы «приятные» где-то посередине и «_ugly» в конце. Я пробовал с и без '*' внутри скобок, но я все еще получаю эти нежелательные файлы ... –

+0

@RickyRobinson: Пожалуйста, покажите конкретный пример. – choroba

+0

ОК, я добавил пример, основанный на вашем ответе. –

1

Использование find:

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

Это не работает ... –

+0

Это работает для меня. Вы выполняли ту же самую команду в каталоге, содержащем 'someSubFolderCommonPathName'? – dogbane

+0

Я добавил пример с вашим решением. Можете ли вы, пожалуйста, взглянуть? Большое спасибо! –

Смежные вопросы