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
is 인 /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이 없는 숫자의 경우zsh
glob은 숫자 범위 일치를 지원하는 몇 안 되는 패턴 일치 API 중 하나입니다.