2012-02-23 4 views
4

배경 : 루트 웹에있는 모든 코드 파일 (.html | .htm | .php | .js | .css)의 전체 줄 수를 얻으려고합니다. 이 출력을 xargs wc -l | grep total으로 파이프하여 dir (재귀 적으로). this에 따르면 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) 

,

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

@ruakh이 돈을 벌고 있습니다. –

+0

.. 그리고 Mac은 ERE를 위해 -E 옵션을 필요로했습니다. – commonpike

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

탈출 문자 (그래서 나는 여기에 열심있었습니다).

관련 문제