동일한 CWD에서 정규 표현식으로 작업하지만 다른 디렉토리에서는 작업하지 않음

동일한 CWD에서 정규 표현식으로 작업하지만 다른 디렉토리에서는 작업하지 않음

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. 따라서 $directoryis 인 /some/dir경우 -regex정규식을 와 일치시키고 /some/dir/file-discovered-by-find첫 번째 문자가 /alnum이 아닌 a이므로 여기서는 절대 일치하지 않습니다.

첫 번째 경우, 정규 표현식은 ^./( 정규 표현식 연산자 ^\./와 같 거나 GNU 에서 암시하는 것처럼 ) as there was 로 시작했습니다 ..\./^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디렉토리에 대한 심볼릭 링크 인 경우에도 작동합니다 ( 그러나 이에 -H대한 옵션을 추가할 수 있습니다).find
  • 파일 경로(이 경우 의 내용 $directory)에 현재 로케일에서 유효한 문자를 형성하지 않는 일련의 바이트가 포함되어 있는 경우에도 작동합니다( find's -regex는 유효한 문자와만 일치하므로 .*일치할 수 없습니다 )..
  • 해당 목록을 인쇄하는 대신 직접 사용할 수 있습니다(명령에 대한 인수로, 반복 실행 등).
  • 또한 (<0-255>~????*)3자리 이하로 구성된 0에서 255까지의 십진수 일치 또는 (<0-255>~0?*)앞에 0이 없는 숫자의 경우 zshglob은 숫자 범위 일치를 지원하는 몇 안 되는 패턴 일치 API 중 하나입니다.

관련 정보