파일 이름을 확인하는 정규 표현식

파일 이름을 확인하는 정규 표현식

~에 따르면이 스레드:

Q: ack는 Perl에서 파생된 정규식을 사용한다고 알고 있습니다. 이것이 맞습니까?

대답: 그렇습니다. 실제로 ack는 Perl로 작성되었으며 표현식을 내부 엔진으로 전달합니다.

이제 현재 디렉터리에 다음과 같은 파일이 있습니다.

media_group_xml_producer.py

내가 할 때 :

> ack -n '.*group.*producer.*' 

또는 더 직접적으로:

> ack -n --python '.*group.*producer.*' 

결과가 없습니다. 내가 아는 한 정규식은 파일과 일치해야 합니다. 왜 그것을 놓쳤습니까?

답변1

현재 디렉토리에서 파일 이름을 grep해야 하는 경우

ack는 파일 이름이 아니라 파일 내용과 일치합니다. 이름이 정규 표현식과 일치하는 파일을 찾으려면 파일 이름 목록에 대해 ack를 실행하세요.

ls | ack '.*group.*producer.*'

당신은 무엇을 했나요?

ack -n '.*group.*producer.*'

현재 디렉토리에서 파일을 찾습니다포함하다정규식과 일치하는 항목입니다.

하위 디렉터리 경로를 포함한 전체 파일 이름에 대해 정규식을 실행하려는 경우

ls경로와 파일 이름을 인쇄하는 옵션이 없으므로 자르지 않습니다. 대신 (들여쓰기 행을 인쇄하지 않음) 및 (전체 파일 이름 인쇄) tree플래그를 사용하십시오.-i-f

tree -if | ack 'shepherd.*\.pyc?'

반품

./models/shepherd.py
./models/shepherd.pyc
./services/shepherd-related/flock_of_sheep.py
./services/shepherd-related/flock_of_sheep.pyc

물론 위의 모든 내용 grep은 및 에 적용됩니다 ack. 하지만 ack모든 면에서 확실히 더 좋습니다. :-)

답변2

당신은 ack뭔가를 오해했습니다. grep시뮬레이션이 아니라 시뮬레이션 입니다 find. 패턴과 일치하는 파일 이름을 검색하지 않고 주어진 패턴에 대한 파일 내용을 검색합니다. 당신은 사용해야합니다

find -regex '.*group.*producer.*' 

또는

find -name '*group*producer*' 

이것을 사용하겠다고 고집한다면 ack(비록 말이 안 된다고 생각하지만) 출력을 구문 분석하여 파일을 얻을 수 있습니다.

$ ack -f | ack '.*group.*producer.*' 
media_group_xml_producer.py

실제로 아무것도 검색하지 않고 검색 중인 모든 파일을 인쇄 하고 ack -f, 두 번째 파일은 정규식과 일치하는 파일 이름을 인쇄합니다.

관련 정보