Find는 동일한 CWD에서 regexp를 사용하지만 다른 디렉토리에서는 사용하지 않습니다.

Find는 동일한 CWD에서 regexp를 사용하지만 다른 디렉토리에서는 사용하지 않습니다.

find 명령이 있는데 임의의 디렉토리에서 명령을 실행하고 점을 현재 작업 디렉토리의 변수로 $directory바꾸고 싶습니다..

이게 무슨 효과가 있는 거야?

  • 실시예 1
find $directory -maxdepth 1 -type d -name "test*"

이것은 나에게 몇 가지 결과를 제공합니다.

이것도 작동합니다

  • 실시예 2
find . -maxdepth 1 -type d -regextype posix-extended -regex "^./[a-zA-Z0-9]+([-_]?[a-zA-Z0-9]+)*-[0-9]{1,3}(.[0-9]{1,3}){,3}\$"

그러나 a를 사용하면 $directory작동하지 않습니다. ./처음에는 정규식을 제거했습니다 .

  • 실시예 3
find $directory -maxdepth 1 -type d -regextype posix-extended -regex "^[a-zA-Z0-9]+([-_]?[a-zA-Z0-9]+)*-[0-9]{1,3}(.[0-9]{1,3}){,3}\$"

왜 이런 일이 발생합니까?

감사해요

답변1

-regex(비표준), -path파일의 전체 경로에 대한 표준 일치와 같습니다. 이러한 경로는 의 내용으로 시작하고 $directory그 뒤에 발견된 디렉터리와 파일이 옵니다 find. 따라서 $directory이면 정규식과 일치하지만 /some/dir첫 번째 문자가 alnum이 아닌 a이기 때문에 여기서는 절대 일치하지 않습니다 .-regex/some/dir/file-discovered-by-find/

첫 번째 경우 정규식은 ^./( 정규식 연산자 ^\./이거나 GNU에 암시된 대로)로 시작합니다..\./^find-regex$directory.

( ...) 안의 모든 정규식 연산자를 이스케이프해야 한다는 $directory점을 기억하면서 와 비슷한 작업을 수행해야 합니다 . 하지만 여기서는 다음과 같이 할 수도 있습니다.$directory^$*()+[]?.\

find "$directory" -maxdepth 1 -type d -regextype posix-extended \
  -regex '.*/[[:alnum:]]+([-_][[:alnum:]]+)*-[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){0,3}'

.( 또한 문자뿐만 아니라 \.리터럴과도 일치시키려는 것으로 의심되어 여기서 필요하지 않은 문자를 제거했습니다.).?

즉, 패턴(여기에 포함되지 않음이 보장됨 /)이 일치하는 항목 이후가 아니라 일치하는 항목 이후 /(및 파일 경로 끝까지(또한 암시됨)까지 ) 일치하도록 합니다 .$$directory

를 사용하면 zsh -o extendglob다음을 수행할 수 있습니다.

set -o extendedglob
w=[0-9a-zA-Z] d=[0-9]
print -rC1 -- $directory/$~w##([-_]$~w##)#-$~d(#c1,3)(.$~d(#c1,3))(#c0,3)(#q/)

GNU 에 비해 ​​몇 가지 장점이 있습니다 find.

  • GNU가 아닌 시스템에서도 작동합니다(GNU에 대한 의존성 제거 find).
  • 초기 에도 $directory유효-
  • 정렬된 목록을 제공합니다
  • in 과 일치하는 것은 무작위가 zsh아니며 [a-zA-Z0-9]in 처럼 로케일마다 다르지 않으며 find일치시키려는 문자와만 일치합니다. 에서는 동등한 것을 얻어야 find합니다 .[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]
  • 디렉토리에 대한 심볼릭 링크를 사용해 도 작동합니다( 이에 대한 옵션을 $directory추가할 수 있음 ).-Hfind
  • 파일 경로(이 경우 내용 $directory)에 현재 로케일에서 유효한 문자를 형성하지 않는 바이트 시퀀스가 ​​포함되어 있는 경우 에도 작동합니다 ( 유효한 문자만 일치하기 때문에 find' -regexs는 .*이러한 바이트와 일치할 수 없습니다 )..
  • 목록을 인쇄하는 대신 직접 사용할 수 있습니다(명령에 대한 인수로, 반복 실행 등).
  • (<0-255>~????*)0에서 255 사이의 3자리 이하의 숫자로 구성된 십진수 일치 또는 (<0-255>~0?*)앞에 0이 없는 숫자 등을 사용할 수도 있습니다 . zshglob은 숫자 범위 일치를 지원하는 몇 안 되는 패턴 일치 API 중 하나입니다.

관련 정보