2016-04-20 4 views
0

Я хочу сделать некоторую обработку только с исходными файлами типа .h, .m, .mm. Я НЕ хочу включать файлы .html.Совпадение файлов .h, .m, .mm, но NOT .html

Следующие файлы пропускаются .mm, так как я только сопоставляю .h или .m и не пытаюсь уловить длинные расширения.

find ./ -type f -name "*.[hm]" 

Это только ловит файлы .mm, как? оператор всегда соответствует символу. Я хотел бы, чтобы это было необязательное ноль или одно совпадение, как в regex.

Но если я использую * вместо этого, оно соответствует 0 или нескольким символам. Это возвращает все, но также имеет .html-файлы, которые я не хочу.

find ./ -type f -name "*.[hm]*" 

Любые идеи о том, как это сделать?

+1

Если вы предпочитаете использовать 'regex' шаблоны,' find' имеет такую ​​возможность. Попробуйте 'find. -regex ". * \. \ (h \ | m \ | mm \)". – alvits

+0

@alvits Это именно то, что я искал, но я не могу заставить ваш пример работать. Как только я положил в | состояние это ломается. Я также попробовал следующее более простое регулярное выражение, которое использует? как нулевой вариант или один матч без везения. 'найти. -type f -regex ". * \. [hm] m?" ' –

+0

Правильное регулярное выражение для этого будет' find. -regex ". * \. \ ([hm] \ | mm \)". – alvits

ответ

1

Вы были запущены OS X. Существует переключатель -E, который вы можете использовать, чтобы сообщить find, что регулярное выражение является расширенным выражением.

Интерпретировать регулярные выражения, за которыми следуют праймеры -regex и -iregex как расширенные (современные) регулярные выражения, а не обычные регулярные выражения (BRE). На странице руководства re_format (7) полностью описаны оба формата.

Ваша команда должна теперь работать:

find -E . -type f -regex ".*\.([hm]|mm)" 
+0

Мне очень нравится эта возможность использовать полное регулярное выражение вместо других опций 'find'. Спасибо, что указали это - я буду использовать его исключительно в будущем. –

3

Вы можете комбинировать условия:

find -type f -and \(-name '*.h' -or -name '*.m' -or -name '*.mm' \) 

Или:

find ./ -type f -and -name '*.[hm]*' -and -not -name '*.html' 
+0

Хотя OP не сказал, что другие файлы могут существовать или даже не может знать, что другие файлы могут существовать, чем упомянутые 3, ваше второе решение найдет другие файлы, которые могут заканчиваться на '.mpg',', mpa', '.mpeg' и многое другое. – alvits

+0

Работал как шарм. Я закончил с 'find ./ -type f -and \ (-name '*. [Hm]' -or -name '* .mm' \)' –

+0

Согласен.Мне нужен первый вариант здесь, так как мне нужно явно сопоставить именно .h, .m .mm и ничего больше. –

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