find를 사용하여 특정 확장자를 가진 파일을 검색하는 방법은 무엇입니까?

find를 사용하여 특정 확장자를 가진 파일을 검색하는 방법은 무엇입니까?

우리는 찾고 싶습니다 .hprof./var

차이점이 뭐야

find  /var -type f -regex '.*\.hprof'
/var/ff-efre-ferg-fr.hprof

그리고

find /var -type f -name "*.hprof"
/var/ff-efre-ferg-fr.hprof

아니면 검색 방법이 완전히 동일합니까?

답변1

조건자는 -name표준이며 파일 이름만 일치하고 쉘 와일드카드 구문을 사용합니다.

이는 일부 구현에서 지원되는 -regex비표준 확장이지만 find구문이 다르고 전체 경로(여기에 제공된 경로 인수로 시작 /opt)와 일치합니다.

기본 구문은 정규식의 일부 형태입니다. 예를 들어 GNU find, GNU emacs정규식을 사용하면 -regextype조건자에서 다양한 정규식 유형을 사용할 수 있습니다. 일부 BSD의 경우 이는 표준 기본 정규식이며 -E옵션(술어 대신)을 사용하여 표준 확장 정규식으로 전환할 수 있습니다.

또 다른 표준 조건자가 있습니다. -pathlike는 -regex전체 경로와 일치하고 like는 -name쉘 와일드카드를 사용합니다.

일부 구현에서는 대소문자를 구분하지 않고 일치하도록 일부 -iname, -ipath, 조건자를 지원합니다. -iregexGNU는 (rms 객체를 단어로) 지원 find합니다 .-wholename-path일부 디렉터리 구성 요소를 포함한 전체 파일 이름을 나타냅니다.

find  /opt -type f -regex '.*\.hprof'

그리고

find  /opt -type f -path '*.hprof'

지원되는 -regex와일드카드 *및 정규식(모든 변형) .*은 .임의 개수의 문자.

그들은 다른 결과를 줄 수 있습니다

find  /opt -type f -name '*.hprof'

경로 구성 요소(이름 제외)에 로케일에서 유효한 문자를 형성하지 않는 일련의 바이트가 포함된 파일의 경우.

$ mkdir $'St\351phane'
$ touch $'St\351phane/file.hprof'
$ locale charmap
UTF-8
$ find . -regex '.*\.hprof'
$ find . -path '*.hprof'
$ find . -name '*.hprof'
./St?phane/file.hprof

이는 디렉터리이지만 UTF-8이 아닌 iso8859-1(0351, 0xe9)로 Stéphane인코딩됩니다 . éUTF-8 로케일에서 이 0xe9 바이트는 문자에 매핑되지 않으므로 정규식 .이나 와일드카드 *(적어도 GNU의 경우 find)와 일치하지 않습니다. 하지만 파일의 기본 이름( file.hprof)은 괜찮으므로 -name일치합니다.

이식성과 신뢰성을 극대화하기 위한 몇 가지 경험 법칙:

  • -name*.hprof여기에서 확장자 검색 과 같이 파일 이름만 일치시키고 파일이 있는 디렉터리는 일치시키지 않아도 되는 경우(와일드카드 구문이면 충분함)에 사용하세요 .
  • -path파일이 있는 위치도 일치시켜야 하는 경우(예 find . -path ./special-dir -prune -o -type f -print: )(와일드카드 구문으로 충분함) 를 사용하십시오.
  • -regex와일드카드가 충분하지 않은 경우 와일드카드를 사용하되 대상으로 삼아야 하는 구현의 지원을 확인하고 정규식 구문이 다를 수 있다는 점에 유의하세요. 파일 이름만 일치시켜야 하는 경우 canmatch 를 사용하지 마십시오 /.

관련 정보