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
추가할 수 있음 ).-H
find
- 파일 경로(이 경우 내용
$directory
)에 현재 로케일에서 유효한 문자를 형성하지 않는 바이트 시퀀스가 포함되어 있는 경우 에도 작동합니다 ( 유효한 문자만 일치하기 때문에find
'-regex
s는.*
이러한 바이트와 일치할 수 없습니다 )..
- 목록을 인쇄하는 대신 직접 사용할 수 있습니다(명령에 대한 인수로, 반복 실행 등).
(<0-255>~????*)
0에서 255 사이의 3자리 이하의 숫자로 구성된 십진수 일치 또는(<0-255>~0?*)
앞에 0이 없는 숫자 등을 사용할 수도 있습니다 .zsh
glob은 숫자 범위 일치를 지원하는 몇 안 되는 패턴 일치 API 중 하나입니다.