2012-02-23 2 views
4

Фон: Я пытаюсь получить общее количество строк всех файлов кода (.html | .htm | .php | .js | .css) в моей корневой сети dir (рекурсивно) путем подачи этого вывода на xargs wc -l | grep total.команда regex/linux find не работает должным образом

$ find . -regex '.+\.php' 
./inc/db.php 
./inc/userauth.php 
./index.php 
.......... etc. 

$ find . -regex '.+\.js' 
./inc/jquery-1.7.1.js 
./inc/script.js 

$ find . -regex '.+\.(php|js)' 
(returns nothing) 

Согласно this,

abc(def|xyz) matches abcdef or abcxyz 

Так стоит не .+\.(php|js) матча всех .php файлов и .js файлов?

+1

Вам нужно избежать определенных символов, которые интерпретируются оболочкой bash. Вы можете найти список этих символов здесь: http://www.grymoire.com/Unix/Quote.html –

+2

@NickGarvey: Я думал, что эти символы не будут иметь никакого особого значения при использовании в одинарных кавычках. –

+0

Не имеют никакого особого значения, когда в одинарных кавычках. Проблема, объясняемая в ответах, заключается в том, что экранирование требуется для определенных символов, если не используется ERE. По умолчанию GNU find использует emacs regex, для которого требуется экранирование. – jordanm

ответ

6

find использует другой стиль регулярного выражения, поэтому вам нужно написать \(js\|php\) вместо (js|php).

+3

+1. В качестве альтернативы вы можете указать 'find' использовать ERE (которые больше похожи на регулярные выражения, которые имеет в виду OP), написав' find. -regextype posix-extended -regex '. + \. (php | js)' '. – ruakh

+0

@руах прямо на деньги. –

+0

.. и mac нужен вариант -E для EREs – commonpike

4
find . -regex '.+\.\(php\|js\)' 

Escape символов, которые являются особыми, хотя это зависит от вашей оболочки (так что я был ревностным здесь).

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