모든 서브 디렉토리에 디렉토리를 작성하는 방법


34

다음과 같은 디렉토리 구조가 있다고 가정하십시오.

$ [~ / 연습] ls
a / b / c / d /

이제 tmp1모든 하위 디렉토리에 디렉토리를 practice만들고 싶습니다.

$ [~ / 연습] mkdir * / tmp1
mkdir :`* / tmp1 '디렉토리를 만들 수 없습니다 : 그러한 파일이나 디렉토리가 없습니다

그런 다음 -p스위치를 시도하고 *하위 디렉토리로 이름이 지정된 디렉토리로 끝납니다.tmp1

$ [~ / 연습] mkdir -p * / tmp1

$ [~ / 연습] ls
* / a / b / c / d /

-p존재하지 않는 디렉토리를 여러 개 만드는 것이 스위치 사용이라는 것을 알고 있습니다 . 나는 그것이 도움이 될 것이라고 생각했습니다.

tmp1모든 서브 디렉토리에서 한 번에 작성하는 방법

이 작업을 수행 할 수있는 경우, 어떻게 그것을 만들 확장 할 \tmp1, \tmp2, \tmp3\a, \b그리고 \c한 번에?

편집 : 나는 디렉토리가 간단하고 순서 등이 될 필요가 없다는 언급 놓친 a, b, c등, 그리고 생성 할 디렉토리와 같은 필요는 없다 tmp1, tmp2.

$ [~ / 연습] ls
개 / 고양이 / 쥐 /

그들에서, 나는 같은 것을 갖고 싶습니다

$ [~ / 연습] ls *
개:
빨강, 파랑/

고양이:
빨강, 파랑/

쥐:
빨강, 파랑/

1
을 감안할 때 크리스토퍼의 답변을 , 당신은 ", \, tmp2을 \ tmp1을 만들 \ tmp3에서 \ A, \ B와 \ C는"3 구 개 하위 디렉토리의 총 결과 여부를 명확히해야한다.
manatwork

@ manatwork : 좋은 지적입니다. 9 개의 서브 디렉토리를 작성해야합니다.
Animesh

이것은 sudo find 디렉토리의 이름으로 공간 문제를 해결하는 데 도움이됩니다. / -depth -type d -exec echo ' "{} / RCS"'\;

답변:


44

globs의 :

for dir in */; do mkdir -- "$dir/tmp1"; done

노트

  • 나는 */글로브 로 사용하는 작은 해킹으로 다이어 (다이어리에 대한 심볼릭 링크 포함) 만 취급합니다.
  • 한 번에 여러 개의 하위 디렉토리를 작성하려면 다음을 수행하십시오.

    for dir in */; do mkdir -- "$dir"/{tmp1,foo,bar,qux}; done


내가 할 수있는 for i in */; do mkdir "$i/itemone" "$i/itemtwo"; done여러하지-의 주문 디렉토리 이름을?
Animesh

나는 이것을 테스트했으며 매우 가능합니다. 감사.
Animesh

편집 한 게시물보기
Gilles Quenot

1
괄호 확장은 인용 문자열로 수행되지 않습니다.
manatwork

예, 감사합니다. Stephane Chazelas가 게시 한 글을 참고하십시오.
Gilles Quenot

10

[...] \ a, \ b 및 \ c에 \ tmp1, \ tmp2, \ tmp3을 한 번에 만들도록 어떻게 확장합니까?

 mkdir {a,b,c}/tmp{1,2,3}

10

GNU 또는 BSD *로 다음을 찾으십시오.

find -mindepth 1 -maxdepth 1 -type d -exec mkdir {}/newdir \;

또는 매개 변수 확장 사용 :

dirs=(*/)
mkdir -- "${dirs[@]/%/newdir}"

* OS X 포함


2
표준 찾기 구문 :find . -name . -o -prune -type d -exec sh -c 'exec mkdir "$1/newdir"' sh {} \;
Stéphane Chazelas

1
또한 두 솔루션의 차이점에 유의하십시오. 첫 번째 솔루션에는 숨겨진 디렉토리가 포함되고 두 번째 솔루션에는 현재 디렉토리의 symlink로 연결된 디렉토리에 newdir이 추가됩니다.
Stéphane Chazelas

6

을 언급 한 이후로 주제 bash를 벗어 났지만 zsh를 사용하면 레코드에 대해 다음을 수행 할 수 있습니다.

dirs=(*(/))
mkdir -- $^dirs/tmp1

$^var배열 확장을 위해 중괄호와 같은 확장을 켭니다 . rc^연산자와 rc(또는 그 파생어 es)를 연상케 합니다.

dirs=(*/)
mkdir -- $dirs^tmp1

그러나 rc 솔루션 dirs에는 디렉토리에 대한 심볼릭 링크도 포함되어 있습니다 ( 여기에 제공된 bash 솔루션에도 동일하게 적용됨) . zsh을 솔루션에서 변화 *(/)*(-/)원하는 경우는 디렉토리에 심볼릭 링크를 포함합니다.


심볼릭 링크에 대한 당신의 포인트 +1! 이 동작이 필요할 수 있지만 -p플래그를 사용하여 중복 디렉토리 작성에 대한 mkdir의 불만을 억제 할 수 있습니다 .
kojiro

4

이식 가능하게 상위 디렉토리를 반복하십시오.

for d in */; do mkdir "$d/red" "$d/blue"; done

이름이로 시작하는 디렉토리가 있으면 --뒤에 추가하십시오 .mkdir-

zsh에서는 e glob 한정자를 사용하여 단일 명령으로 수행 할 수 있습니다 .

mkdir *(/e\''REPLY=($REPLY/{red,blue})'\')

그러나 이것을 두 개의 명령으로 입력하는 것이 더 빠릅니다.

d=(*(/)); mkdir $^d/{red,blue}

1
A, 차라리 말하고 싶지만 참조로 의미 사이트에 " mkdir -- whatever생략을 -- 당신의 확장하려는 경우 어떤 가능성에 옵션으로 취해야 할 mkdir명령.". --여기서 생략 할 필요는 없습니다 . OP의 경우에는 문제가되지 않지만 일반적인 경우에는 문제가되지 않습니다. 우리는 여기서 정확하고 안전한 구문을 가르쳐야 할 의무가 있다고 생각합니다.
Stéphane Chazelas

@StephaneChazelas 스크립팅 컨텍스트에서 줄 --바꿈이 지원되지 않는 경우 항상 필요한 모든 따옴표와 큰 경고를 표시합니다. 커맨드 라인 컨텍스트에서, 나는 실제로 작동하는 빠른 버전과 방탄 버전을 보완으로 보여주는 것을 선호합니다.
Gilles 'SO- 악마 그만해'



1

/ etc / * 설정 파일을 버전 제어 (RCS 체크인이 잠긴 상태에서 ci -l로 간단한 주석을 ir :: 초기 릴리스의 경우)로 사용하려면 이전 Unix 마스터 (FreeBSD 10.1에서 테스트)에서 좋은 것입니다. ~ / .his / etc에

sudo rsync -av /etc/ ~/.his
sudo find -d ~/.his/etc -type d -exec echo '{}/RCS' \; | xargs sudo mkdir -p
sudo find -d ~/.his/etc \! -name "RCS" | xargs sudo ci -l -mir -t-ir

나는 이것이 어떻게 OP에 대답하는지 보지 못합니다
Archemar

1

해야한다 \! 이름은 "RCS"이며 처음 체크인 할 때 가장 잘 작동합니다.

sudo 찾기 ~ / .his / etc \! -이름 "RCS"-ls

sudo find -d ~ / .his / etc \! 이름 "RCS"| xargs sudo ci -l -mir -t-ir

이 마지막 파일은 파일 이름의 모든 RCS 내용을 부분적으로 필터링하는 cjeck에서도 매우 잘 작동합니다.

sudo find -d ~ / .his / etc -type f | grep -v RCS | xargs sudo ci -l -mir -t-ir


1

이것은 나에게 큰 도움이됩니다. 여러 폴더 및 다음과 같은 하위 디렉토리 세트를 작성해야했습니다.

!/bin/sh

cd /dest/cont

for dir in */*/; do
    mkdir -p -- $dir/{FB,Video,Audio,proj};
done

공백이있는 경우를 제외하고는 훌륭하게 작동했습니다. */*/인수 의 일부 에서 공백을 무시하는 방법이 있습니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.