특정 문자열/정규식 값이 지정된 모든 파일을 검색하려고 합니다. 그러면 이름에 "hello"가 포함된 모든 파일을 검색하려면 어떻게 해야 합니까? 상황을 더 복잡하게 만들기 위해 이름이 두 글자로 시작하고 그 뒤에 대시와 숫자가 오는 파일을 어떻게 찾습니까?
나는 find 명령을 시도했고 그것이 hello 사례에 도움이 되었습니다. 입력을 원 find <dir> *hello*
하지만 정규식 값에서는 작동하지 않습니다.
입력하면 find -E <dir> -regex '^[a-z]{2}-[1-9]'
아무 일도 일어나지 않습니다. 를 입력해도 find -E <dir> -regex '*[0-9]*'
아무 일도 일어나지 않습니다.
누구든지 이 문제를 해결하도록 도와줄 수 있나요? 미리 감사드립니다
답변1
-regex
전체 파일 경로(이름뿐만 아니라)와 일치하며 기본적으로(암시적 ^
으로 ) $
앵커를 일치시킵니다 .
여기서는 정규식이 필요하지 않으며 -name
와일드카드 패턴을 사용하고 경로 대신 파일 이름과 일치하는 기준을 사용할 수 있습니다.
find . -name '*hello*' -name '[[:alpha:]][[:alpha:]]-[1-9]*'
2글자, 하이픈, 1~9 사이의 숫자로 시작하고 "hello"를 포함하는 파일 이름의 경우.
정규식을 사용하면(이 경우 FreeBSD/OS/X ) find
이는 다음과 같아야 합니다.
find -E . -regex '.*hello[^/]*' -regex '.*/[[:alpha:]]{2}-[1-9][^/]*'
[^/]*
예를 들어 반대 방향 대신에 이 값이 필요하며 .*
일치합니다../aa-9/hello/foo/bar
어쨌든, find <dir> *hello*
그것은 당신이 생각하는 대로 되지 않습니다. 쉘은 *hello*
이 glob을 이름에 "hello"가 포함된 현재 디렉토리의 숨기지 않은 파일 또는 디렉토리 목록으로 확장하고 결과를 에 추가 인수로 전달합니다 find
.
답변2
실패했으니까 *[0-9]*
그렇지.정규식 대신 glob. glob에서는 *
"0개 이상의 문자"를 의미합니다. 단, 정규식에서는 *
"* 앞에 0개 이상"을 의미합니다. 즉 *
,수량자
그리고 그것은 당신이 무언가를 정량화하는 경우에만 의미가 있습니다.
따라서 0개 이상의 문자와 0개 이상의 숫자를 일치시키는 정규식은 입니다 .*[0-9]*
. 또한 -regex
with 를 사용하면 find
정규식은 파일의 전체 패턴과 일치하므로 이를 고려해야 합니다. 이 모든 것을 종합하면, 당신이 찾고 있는 것은 다음과 같습니다:
find /path/to/dir -regex '.*/[a-z][a-z]-[1-9].*'
마지막으로 이러한 구조는 find에 전달할 때 항상 인용되어야 합니다. 이렇게 하지 않으면 쉘이 *
이를 find
.