다음 코드가 실행 중입니다.
mkdir /home/karan/{Pictures,Public}/yo
위의 줄은 yo
and 라는 디렉토리 내에 명명된 디렉토리를 생성합니다. 그러나 아래 코드를 사용하면 오류가 발생합니다.Public
Pictures
mkdir /home/karan/{P*}/yo
error: cannot create directory ‘/home/karan/{P*}/123’
별표가 지정된 디렉토리로 확장되지 않는다는 것을 이해하지만 그 이유를 이해할 수 없습니다. 또한 별표 확장을 억제하기 위해 인용 메커니즘을 사용하지 않습니다.
답변1
를 사용하면 zsh
다음을 수행할 수 있습니다.
(){ mkdir $^@/yo; } /home/karan/P*(/)
(여기서 $^array
open rcexpandparam
(스타일 배열 확장의 경우 )은 확장 및 해당 glob의 확장 rc
에만 사용됩니다 ( 여기서 glob 한정자는 파일 유형을 제한하는 데 사용됩니다)$array
/
목차$@
) 익명 함수를 사용하여 배열로 변환합니다).
아니면 이렇게 할 수도 있습니다:
mkdir /home/karan/P*(/e:REPLY+=/yo:)
( e
평가 glob 한정자를 사용하여 /yo
일치하는 파일에 a를 추가합니다.)
또는:
set -o histsubstpattern
mkdir /home/karan/P*(/:s:%:/yo)
(이 경우 :s/string/replacement/
csh 스타일 수식어를 사용하여 추가됩니다 /yo
. For 는 histsubstpattern
패턴 string
으로 해석되며 ksh 와 마찬가지로 ${var/pattern/replacement}
선행은 %
패턴이 테마 끝에 고정된다는 의미입니다)
그리고 rc
또는 파생상품:
dirs = ( /home/karan/P*/ )
mkdir $dirs^yo
es
, 파생 함수 중 하나 에는 위와 유사하지만 구문이 다른 익명 함수 rc
도 있습니다 .zsh
@ {mkdir $*^yo} /home/karan/P*/
그리고 fish
:
set dirs /home/karan/P*/
mkdir ${dirs}yo
ksh93이나 bash(또는 zsh)를 사용하면 언제든지 다음을 수행할 수 있습니다.
dirs=(/home/karan/P*/)
mkdir "${dirs[@]/%/yo}"
또는 쉘과 GNU를 사용하십시오 xargs
.
printf '%syo\0' /home/karan/P*/ | xargs -r0 mkdir
('s와는 반대로)의 확장에는 P*/
디렉토리에 대한 기호 링크도 포함됩니다. 실제로 원하는 것이면 glob 한정자를 대체하십시오.zsh
P*(/)
zsh
/
-/
답변2
중괄호를 확장하는 패턴은 선택적 서문의 형태를 취하고 그 뒤에 쉼표로 구분된 문자열 시퀀스 또는 중괄호 쌍 사이의 시퀀스 표현식이 옵니다.
당신의 시도
-
mkdir /home/karan/{P*}/123
중괄호 안에 쉼표나 시퀀스가 없기 때문에 유효한 중괄호 확장 형식이 아닙니다. 그러므로 당신은 당신이 준 것을 정확히 얻습니다 /home/karan/{P*}/123
.
-
mkdir /home/karan/{P*,}/123
/home/karan/P*/123
디렉토리 생성 을 시도하는 중괄호 확장(쉼표에 주의)입니다 /home/karan//123
. 아직 및 디렉토리 P*
가 없기 때문에 파일 이름 확장을 통한 확장은 아직 없습니다 . 즉, 일치하는 항목이 없으면 파일 이름 확장이 발생하지 않습니다..../Pictures/123
.../Public/123
어쨌든 (1)에서 볼 수 있듯이 단일 요소에 중괄호 확장을 사용하는 것은 의미가 없습니다. 이는 하나의 시소와 같습니다. 직접
-
mkdir /home/karan/P*/123
같은 이유로 실패합니다. 일치하지 않습니다.
특정 경우에 경로 철자를 피하는 좋은 방법은 없지만 일치하는 디렉터리나 경로가 많으면 for 루프를 사용하면 키 입력을 절약할 수 있습니다.
for d in /home/karan/P*/; do mkdir "$d"yo; done