Linux(이 경우 Ubuntu)의 홈 폴더에서 특정 정규식과 일치하는 모든 파일을 찾고 싶습니다. 이를 수행하는 데 사용할 수 있는 간단한 Unix 명령이 있습니까?
예를 들어, 내 홈 폴더에서 이름에 다음 정규식과 일치하는 모든 파일을 찾고 싶습니다(여기에서는 Javascript 스타일 표기법 사용).((R|r)eading(T|t)est(D|d)ata)
답변1
찾기 -name
옵션은 파일 글로빙을 지원합니다. 또한 제한된 대괄호 표현식과 같은 제한된 정규식 유사 옵션 세트를 지원하지만 실제 정규식 일치를 위해서는 -regex
.
매칭을 찾고 계시다면콘텐츠grep -r
Craig가 제안한 대로 사용되는 파일입니다 .
파일 이름을 일치시키려면 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를 사용하지 마세요.
(R|r)
단지 그것을 작성하는 장황한 방법일 뿐입니다[Rr]
. 또한 클래스보다 속도가 느립니다(그러나 수백만 번 실행되는 루프에 속하지 않는 한 문제가 될 만큼 충분하지 않습니다).grep -lr '[Rr]eading[Tt]est[Dd]ata' ~/
대소문자를 완전히 구분하지 않음:
grep -lir 'readingtestdata' ~/
하위 디렉토리가 아닌 ~에서만 파일을 검색하려면 다음을 사용할 수 있습니다
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)
foo
bar
foo|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