find의 "regex" 및 "name" 지시어

find의 "regex" 및 "name" 지시어

-name명령 옵션에는 어떤 정규식 구문이 필요합니까 find? 나는 그것이 for와 같다고 생각했지만 -regex그렇지 않은 것 같습니다.

$ mkdir test && cd test
$ touch .sw.
$ touch .swp
$ touch .abc.swo
$ touch notswap.py
$ find . -name "*sw." -type f
./.sw.
$ find . -name "*sw*" -type f
./notswap.py
./.sw.
./.swp
./.abc.swo
$ find . -regex ".*sw." -type f
./.sw.
./.swp
./.abc.swo

-regexFWIW, 전체 경로와 -name파일 이름의 기본만 일치한다는 것을 알고 있습니다 . 이것이 여기서의 문제가 아니라는 것이 모든 사람에게 분명해지기를 바랍니다. 보다 구체적인 질문으로, .swxwhere can be any Character 로 x끝나는 모든 파일을 일치시키기 위해 해당 옵션을 어떻게 사용할 수 있습니까 -name?

메타 정보:

$ find --version
find (GNU findutils) 4.5.11
...
$ echo $0
bash

답변1

-name pattern
              Base of file name (the path with the leading directories
              removed) matches shell pattern pattern.  Because the leading
              directories are removed, the file names considered for a match
              with -name will never include a slash, so `-name a/b' will
              never match anything (you probably need to use -path instead).
              A warning is issued if you try to do this, unless the
              environment variable POSIXLY_CORRECT is set.  The
              metacharacters (`*', `?', and `[]') match a `.' at the start
              of the base name (this is a change in findutils-4.2.2; see
              section STANDARDS CONFORMANCE below).  To ignore a directory
              and the files under it, use -prune; see an example in the
              description of -path.  Braces are not recognised as being
              special, despite the fact that some shells including Bash
              imbue braces with a special meaning in shell patterns.  The
              filename matching is performed with the use of the fnmatch(3)
              library function.  Don't forget to enclose the pattern in
              quotes in order to protect it from expansion by the shell.

정규식 대신 쉘 패턴을 사용합니다.

원천:find(1)


GNU 매뉴얼에서이름:

이름이 특정 패턴과 일치하는 파일을 검색하는 방법은 다음과 같습니다. 이러한 테스트의 패턴 매개변수에 대한 설명은 셸 패턴 일치를 참조하세요.

2.1.4 쉘 패턴 매칭

찾기 및 찾기는 파일 이름이나 파일 이름의 일부를 쉘 패턴과 비교할 수 있습니다. 셸 패턴은 와일드카드나 메타문자라는 특수 문자를 포함할 수 있는 문자열입니다.

셸이 자체적으로 확장하는 것을 방지하려면 메타 문자가 포함된 패턴을 인용해야 합니다. 큰따옴표와 작은따옴표 모두 괜찮습니다. 백슬래시도 이스케이프됩니다.

  • *
    0개 이상의 문자와 일치합니다.
  • ?
    임의의 문자와 일치합니다.
  • [string]
    문자열 string에서 정확히 한 문자와 일치합니다. 이를 문자 클래스라고 합니다. 간단히 말해서, 문자열은 사이에 대시가 있는 두 문자로 구성된 범위를 포함할 수 있습니다. 예를 들어 "[a-z0-9_]" 클래스는 소문자, 숫자 또는 밑줄과 일치합니다. 여는 괄호 바로 뒤에 "!" 또는 "^"를 배치하여 클래스를 무효화할 수 있습니다. 따라서 "[^AZ@]"는 대문자나 at 기호를 제외한 모든 문자와 일치합니다.
  • \
    뒤에 오는 문자의 특별한 의미를 제거합니다. 이는 문자 클래스 내에서도 작동합니다.
    쉘 패턴 일치("-name", "-wholename" 등)를 수행하는 찾기 테스트에서 패턴의 와일드카드 문자는 "."와 일치합니다. 파일 이름의 시작 부분에. 찾기의 경우에도 마찬가지입니다. 따라서 "find -name '*macs"는 "locate '*macs"와 마찬가지로 .emacs라는 파일과 일치합니다.

슬래시 문자는 와일드카드 불일치 쉘과 달리 조회 및 위치 지정을 위한 쉘 패턴 일치에서 특별한 의미가 없습니다. 따라서 패턴 'foobar'는 파일 이름 'foo3/bar' 및 패턴 './sr'과 일치할 수 있습니다.sc'는 파일 이름 './src/misc'와 일치할 수 있습니다.

"locate" 명령을 사용하여 특정 파일을 찾고 싶지만 전체 목록을 볼 필요가 없는 경우 "--limit" 옵션을 사용하여 소수의 결과만 보거나 "-- count' 옵션을 선택하면 총 일치 횟수만 표시됩니다.


귀하의 질문에 대답하십시오 :

find . -name "*.sw?" -type f

관련 정보