파일 이름에 정규식 일치 항목이 포함된 폴더의 모든 파일을 찾는 방법은 무엇입니까?

파일 이름에 정규식 일치 항목이 포함된 폴더의 모든 파일을 찾는 방법은 무엇입니까?

Linux(이 경우 Ubuntu)의 홈 폴더에서 특정 정규식과 일치하는 모든 파일을 찾고 싶습니다. 이를 수행하는 데 사용할 수 있는 간단한 Unix 명령이 있습니까?

예를 들어, 내 홈 폴더에서 이름에 다음 정규식과 일치하는 모든 파일을 찾고 싶습니다(여기에서는 Javascript 스타일 표기법 사용).((R|r)eading(T|t)est(D|d)ata)

답변1

찾기 -name옵션은 파일 글로빙을 지원합니다. 또한 제한된 대괄호 표현식과 같은 제한된 정규식 유사 옵션 세트를 지원하지만 실제 정규식 일치를 위해서는 -regex.

매칭을 찾고 계시다면콘텐츠grep -rCraig가 제안한 대로 사용되는 파일입니다 .

파일 이름을 일치시키려면 find해당 -regex옵션을 사용하십시오.

find . -type f -regex '.*[Rr]eading[Tt]est[Dd]ata.*' -print

find괄호 안의 원자는 정규식에서 지원되지 않으므로 정규식의 변환에 유의하세요 . Linux 시스템을 사용하는 경우 GNU find는 -regextype더 많은 제어 기능을 제공하는 옵션을 지원합니다.

find . -regextype posix-extended -regex '.*((R|r)eading(T|t)est(D|d)ata).*' -print

찾고 있는 것이 대소문자 일치뿐이라면 그것 -iregex만으로도 -iname충분할 수 있습니다. Gilles의 globstar 솔루션은 쉘로 사용하는 경우에도 bash작동합니다 .

답변2

grep-r패턴에 대해 모든 하위 디렉터리의 모든 파일을 검색하는 재귀 옵션이 있습니다 .

-l옵션은 이 패턴을 포함하는 파일만 나열합니다. 각 파일의 일치 항목 수를 확인하려면 -c-l 또는 -c를 사용하고, 일치 항목을 보려면 -l 또는 -c를 사용하지 마세요.

  1. (R|r)단지 그것을 작성하는 장황한 방법일 뿐입니다 [Rr]. 또한 클래스보다 속도가 느립니다(그러나 수백만 번 실행되는 루프에 속하지 않는 한 문제가 될 만큼 충분하지 않습니다).

    grep -lr '[Rr]eading[Tt]est[Dd]ata' ~/

  2. 대소문자를 완전히 구분하지 않음:

    grep -lir 'readingtestdata' ~/

  3. 하위 디렉토리가 아닌 ~에서만 파일을 검색하려면 다음을 사용할 수 있습니다 find.

    find ~/ -maxdepth 1 -type f -print0 | xargs -0r grep -l '[Rr]eading[Tt]est[Dd]ata'

답변3

껍질이 있습니다와일드카드일반적인 정규식 구문과 달리 ?모든 단일 문자와 일치하고, *임의 개수의 문자와 일치하며 [abc], a또는 b사이의 단일 문자와 일치합니다 c. 다음 명령은 ((R|r)eading(T|t)est(D|d)ata)이름이 확장 정규식 1과 일치하는 현재 디렉터리의 모든 파일을 표시합니다.

echo *[Rr]eading[Tt]est[Dd]ata*

하위 디렉터리에서도 파일을 찾으려면 먼저 이 명령을 실행하세요 . shopt -s globstar이 명령을 에 넣을 수 있습니다 ~/.bashrc. 그러면 **모든 수준의 하위 디렉터리와 일치하는 패턴이 열립니다 .

echo **/*[Rr]eading[Tt]est[Dd]ata*

쉘 와일드카드는 정규식만큼 강력하지 않습니다. 예를 들어 or( ) 연산자가 없습니다 |. 정규식의 강력한 기능을 사용할 수 있지만 역사적 이유로 인해 다른 구문을 사용합니다. shopt -s exgblob귀하의 항목에 추가한 다음 일치 또는 ( ERE에서와 같이)를 .bashrc사용하고 , 시퀀스의 발생 횟수에 관계없이 ( ERE에서와 같이) 일치하고, 하나 이상의 발생과 일치하고, 0개 또는 1개의 발생과 일치하고 , 다음을 제외한 모든 항목과 일치할 수 있습니다 (ERE에 상응하는 항목 없음) ).@(foo|bar)foobarfoo|bar*(pattern)pattern(pattern)*+(pattern)?(pattern)!(pattern)pattern

1 "확장 정규식"(줄여서 ERE)은 JavaScript에서 사용하는 정규식 구문의 유닉스 이름입니다.

답변4

패턴을 전달하여 다음을 찾으면 됩니다.

$ find . -type f  -name "[Rr]eading[Tt]est[Dd]ata*"

질문의 특정 패턴에 대해 대소문자를 구분하지 않는 조회를 사용하면 됩니다.

$ find . -type f -iname readingtestdata

관련 정보