중괄호 확장 내의 경로명 확장

중괄호 확장 내의 경로명 확장

다음 코드가 실행 중입니다.

mkdir /home/karan/{Pictures,Public}/yo

위의 줄은 yoand 라는 디렉토리 내에 명명된 디렉토리를 생성합니다. 그러나 아래 코드를 사용하면 오류가 발생합니다.PublicPictures

mkdir /home/karan/{P*}/yo
error: cannot create directory ‘/home/karan/{P*}/123’

별표가 지정된 디렉토리로 확장되지 않는다는 것을 이해하지만 그 이유를 이해할 수 없습니다. 또한 별표 확장을 억제하기 위해 인용 메커니즘을 사용하지 않습니다.

답변1

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

(){ mkdir $^@/yo; } /home/karan/P*(/)

(여기서 $^arrayopen 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 한정자를 대체하십시오.zshP*(/)zsh/-/

답변2

배쉬 매뉴얼:

중괄호를 확장하는 패턴은 선택적 서문의 형태를 취하고 그 뒤에 쉼표로 구분된 문자열 시퀀스 또는 중괄호 쌍 사이의 시퀀스 표현식이 옵니다.

당신의 시도

  1. mkdir /home/karan/{P*}/123
    

중괄호 안에 쉼표나 시퀀스가 ​​없기 때문에 유효한 중괄호 확장 형식이 아닙니다. 그러므로 당신은 당신이 준 것을 정확히 얻습니다 /home/karan/{P*}/123.

  1. mkdir /home/karan/{P*,}/123
    

/home/karan/P*/123디렉토리 생성 을 시도하는 중괄호 확장(쉼표에 주의)입니다 /home/karan//123. 아직 및 디렉토리 P*가 없기 때문에 파일 이름 확장을 통한 확장은 아직 없습니다 . 즉, 일치하는 항목이 없으면 파일 이름 확장이 발생하지 않습니다..../Pictures/123.../Public/123

어쨌든 (1)에서 볼 수 있듯이 단일 요소에 중괄호 확장을 사용하는 것은 의미가 없습니다. 이는 하나의 시소와 같습니다. 직접

  1. mkdir /home/karan/P*/123
    

같은 이유로 실패합니다. 일치하지 않습니다.

특정 경우에 경로 철자를 피하는 좋은 방법은 없지만 일치하는 디렉터리나 경로가 많으면 for 루프를 사용하면 키 입력을 절약할 수 있습니다.

for d in /home/karan/P*/; do mkdir "$d"yo; done

관련 정보