디렉토리에서 파일 검색

디렉토리에서 파일 검색

특정 문자열/정규식 값이 지정된 모든 파일을 검색하려고 합니다. 그러면 이름에 "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]*. 또한 -regexwith 를 사용하면 find정규식은 파일의 전체 패턴과 일치하므로 이를 고려해야 합니다. 이 모든 것을 종합하면, 당신이 찾고 있는 것은 다음과 같습니다:

find /path/to/dir -regex '.*/[a-z][a-z]-[1-9]‌​.*'

마지막으로 이러한 구조는 find에 전달할 때 항상 인용되어야 합니다. 이렇게 하지 않으면 쉘이 *이를 find.

관련 정보