`mkdir -p`에 대한 인수 목록을 생성하기 위해 매개 변수 확장 사용


10

나는 이와 같은 것을 가지고있다 :

% ls -1dF /tmp/foo/*
/tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/
/tmp/foo/002e34c2218f2c86fefd2876f0e5c2559c5fb3c4/
/tmp/foo/00b483576791bab751e6cb7ee0a7143af43a8069/
.
.
.
/tmp/foo/fedd0f7b545e7ae9600142656756456bc16874d3/
/tmp/foo/ff51ac87609012137cfcb02f36624f81cdc10788/
/tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/

bar아래의 각 하위 디렉토리 아래 에 디렉토리를 만들고 싶습니다 foo.

내가 이것을하려고하면

% mkdir -p /tmp/foo/*/bar

... 오류가 발생합니다

zsh: no matches found: /tmp/foo/*/bar

(후시로, 오류의 이유를 이해할 수 있습니다.)

for-loop로 원래 문제를 해결할 수 있다는 것을 알고 있지만 zsh의 단일 호출에 대해 원하는 인수를 생성하는 매개 변수 확장 형식을 지원 하는지 알고 싶습니다 mkdir -p. IOW, '추가 등가 파라미터 팽창 /bar팽창에 의해 생성 된 모든 접두사 /tmp/foo/*결과 "

% mkdir -p /tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/bar ... /tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/bar

답변:


13
setopt histsubstpattern extendedglob
mkdir -p /tmp/foo/*(#q/:s_%_/bar_)

이것은 glob 한정자 를 사용하여 디렉토리 만 일치 시키는 uiet glob 플래그 와 각 단어에 문자열을 추가하는 이력 대체 (히스토리 대체 패턴 모드 에서만 사용 가능한 패턴 문자 사용) 를 수행하는 수정자를 갖는 확장 globbing 입니다 .qs%

man zshexpn

와, 감동합니다. 심지어 지정한 매뉴얼 페이지에서 모두 찾았습니다.
와일드 카드

1
Original Poster specified으로 mkdir -p, 일부 디렉토리에 이미 bar서브 디렉토리가있는 경우 오류를 발생시키지 않는 명령과 약간 다른 효과가 있습니다 . 사소한 점이지만 여기서 주목할 가치가 있습니다. :)
와일드 카드

1
또 다른 방법은 via를 통한 배열 확장을 사용하여 확장되는 모든 요소에 ${^spec}추가 bar하는 /tmp/foo/*(/)것입니다. set -- /tmp/foo/*(/)thenmkdir -p -- "${^@}/bar"
don_crissti

5

물론-루프를 사용하십시오

for n in /tmp/foo/*; do mkdir "$n/bar";done

글롭은 아직 생성되지 않은 항목이 아닌 기존 항목의 목록을 확장하는 데 사용됩니다 .


죄송합니다. 내 질문이 명확하게 언급되지 않은 것 같습니다. 나는 그것을 명확히 할 것이다.
kjo

2
zsh글로브를 확장하고 단일 구문으로 텍스트를 추가 할 수 있으면 대답하지 않지만 @kjo와 같이 원하는 것을 수행하는 유일한 방법이라고 생각합니다.
와일드 카드

4

디렉토리가 배열에 있으면 ${^...}확장 형식을 사용할 수 있습니다 .

a=(/tmp/foo/*/)
mkdir -p ${^a}bar

0

당신은 그것을 find하고 xargs할 수 있습니다 :

find /tmp/foo -maxdepth 1 -mindepth 1 -type d | xargs -i echo mkdir -p {}/bar

타겟의 서브 디렉토리 및 그 자체에 생성 을 사용 -maxdepth 1하고 -mindepth 1방지 합니다. 디렉토리 만 고려하게합니다.bar/tmp/footype d

echo실제 작업을 수행 하려면 제거 해야합니다. 그렇지 않으면 echo실행할 행만 인쇄합니다. 당신은 또한 그것을 $()실행하는 것처럼 그것을 대체로 동봉 할 수 있습니다 .

수동을 말한다 xargs -i되지 않는,하지만 여전히 몇 년 동안 일이 ... 당신은 대체 할 수 있어야 그래서 내가 다른 동일하게 편리한 대안을 찾지 -i-I'{}'로 최신의 그것과.


이 답변과 다음 답변은 나에게 잘 어울립니다. 왜 그들이 투표를 거부해야하는지 설명 할 수 있습니까? 다운 투표는 괜찮지 만 이유가없는 경우 어떻게 알 수 있습니까?
Joe

OP가 요구 한 것 외에는 아무것도하지 않는 대안입니다. 나를 때린다.
loa_in_

나는 대답이 그들에게 나쁜 대답을 가져야한다는 것이 일종의 편견이라고 생각한다.
loa_in_

나는 설명 할 수없는 다운 투표를 좋아하지 않지만 그런 편견을 보지 못했습니다. 일반적으로 "나쁜"답변 (내가 이해하는 답변)은 실제로 나쁩니다.
Joe

0

@loa_in_이 대부분 이었지만 파이핑 find출력은 가짜 pas 인 경향이 있습니다.

find /tmp/foo -maxdepth 1 -mindepth 1 -type d -exec mkdir {}/bar \;

나는 대안 xargs이없는 다른 도구와 함께 사용 -exec하므로 모든 도구와 똑같이 작동하므로 접근 방식을 사용합니다.
loa_in_
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.