mkdir을 사용하여 수많은 디렉토리 만들기


14

를 사용하여 많은 디렉토리를 만들고 싶습니다 mkdir. 각 디렉토리 이름은 접두사 (문자열)와 색인 (정수)으로 구성됩니다. 접두사가 "s"이고 색인의 범위가 1-50이되어야한다고 가정합니다. 이는 제목이 다음과 같은 디렉토리를 작성하려고 함을 의미합니다.

s1,, s2... s49,,s50

를 사용하여 자동으로 수행하는 방법이 mkdir있습니까? 시간 내 줘서 고마워.


2
어떤 쉘을 사용하고 있습니까?
Francesco Turco

@FrancescoTurco 사용하고 bash있습니다. 시간 내 주셔서 감사합니다!
앤드류

3
참고로, 나는 그것을 발견 훨씬 더 유용과 같은 고정 폭 인덱스를 사용하여 : s01, s02, ..., s49, s50. 고정 너비 인덱스를 사용하면 /bin/ls거의 항상 원하는 순서를 생성합니다.
Rob

답변:


32

쉘 스크립트로이를 수행 할 수 있습니다.

순수 쉬-이것은 POSIX 이전의 Bourne 쉘에서도 작동합니다.

n=1;
max=50;
while [ "$n" -le "$max" ]; do
  mkdir "s$n"
  n=`expr "$n" + 1`;
done

많은 수의 디렉토리를 작성하려는 경우 단일 호출로 스크립트를 줄이고 mkdir테스트 및 산술을 위해 쉘 내장을 사용하여 스크립트를 더 빠르게 만들 수 있습니다 . 이처럼 :

n=1
max=50
set -- # this sets $@ [the argv array] to an empty list.

while [ "$n" -le "$max" ]; do
    set -- "$@" "s$n" # this adds s$n to the end of $@
    n=$(( $n + 1 ));
done 

mkdir "$@"

Zsh, ksh93 또는 bash는 이것을 훨씬 쉽게 만들어 주지만 이것이 내장되어 mkdir있지 않으며 다른 쉘에서 작동하지 않을 수 있음을 지적해야합니다 . 더 큰 경우에는 명령에 전달 될 수있는 인수의 수 또는 총 크기 제한으로 인해 영향을받을 수도 있습니다.

mkdir s{1..50}

3
+1 대단합니다! 그래도 한 가지에 대해 nitpick해야합니다. n=$(( n + 1 ))엄격히 POSIX 였고 서브 쉘 비용이 들지 않았습니다.
kojiro

@rahmu [[키워드가 POSIX가 아닙니다. (즉, 언급 할 필요가 없을 [ 것입니다 많은 현대 껍질에 쉘 내장.)
코지로

@ kojiro : [[ksh88이전 버전 에서 작동 bash하므로 POSIX라고 가정했습니다. POSIX 사양 에서 언급을 찾을 수 없으므로 귀하가 옳다고 생각합니다. 정보 주셔서 감사합니다!
rahmu

산술 확장을 사용하여 버전을 추가하는 것에 대해 생각했지만 POS 순서 이전 버전에서 작동했던 것들로 "순수 sh"를 제한하고 싶었습니다. 나는 또한 같은 이유로 seq를 언급하지 않았습니다. seq가 있다면 아마도 bash가있을 것입니다. 루프 예제는 또한 더 많은 수의 디렉토리에 대한 인수 제한을 무시하는 데 for i in {range}적합합니다. 이는 고급 쉘 사용자가 사용할 수 있는 장소이기도 합니다.
Random832

마지막에 zsh 힌트는 놀랍습니다. 시간이 많이 절약되었습니다!
Jase

33
  • 하나

    for i in {1..50}; do
      mkdir s"$i"
    done
  • mkdir s{1..50}

    이 옵션은 bash , zshksh93 에서 작동합니다.

  • mkdir $(printf "s%02i " $(seq 1 50))

4
왜 둘 이상을 사용하겠습니까?
케빈

7
$i예를 들어 디렉토리를 만드는 것보다 더 많은 것을 원할 수도 있습니다 mkdir s$i ; echo $i > s$i/$i. 또한 하나는 bash에서 for 루프를 사용하는 좋은 간단한 예입니다. 이와 같은 사이트에서는 초보자 사용자가 그것을보고 "좋아요, 당신이 할 수 있다는 것을 몰랐습니다. "---> 깨달음.
cas

1
@rahmu Bash / Zsh (ksh93도 있음)에있는 기능입니다. 공감할 필요가 없습니다.
helpermethod

3
@rahmu : jhonathan의 답변이 OP의 쉘 (bash)에서 문제를 해결하는 경우에만 고려해야한다고 생각합니다.
Francesco Turco

4
@Kevin은 50에 문제가되지 않지만 500 개의 디렉토리가 있으면 인수 제한에 대해 걱정할 수 있습니다.
Random832

10

여기에는 많은 복잡한 답변이 있지만 bash는 정말 쉽습니다. 물론 순수한 POSIX 솔루션은 작동하지만 bash사용중인 쉘을 활용 해보십시오. 괄호 확장을 사용 하면이 작업을 쉽게 수행 할 수 있습니다 .

% mkdir -v s{1..10} && ls -1d s{1..10}                                   (09-24 17:37)
mkdir: created directory `s1'
mkdir: created directory `s2'
mkdir: created directory `s3'
mkdir: created directory `s4'
mkdir: created directory `s5'
mkdir: created directory `s6'
mkdir: created directory `s7'
mkdir: created directory `s8'
mkdir: created directory `s9'
mkdir: created directory `s10'
s1
s10
s2
s3
s4
s5
s6
s7
s8
s9

5

mkdir $(seq --format 's%.0f' 1 50)

또는 0으로 채워진 숫자를 원한다면 (정렬하기에 더 좋을 것입니다) :

mkdir $(seq --format 's%02.0f' 1 50)

또는:

mkdir s$(seq -s ' s' -w 1 50)-문자열 바로 앞에있는 's'가 $()없으면 첫 번째 디렉토리는 's01'이 아닌 '01'입니다.

그리고 마지막으로: mkdir $(printf "s%02i " $(seq 1 50))

seq GNU Coreutils 출신

이상하게도 seq --format또는 -f옵션은 printf의 부동 소수점 이중 유형 만 허용합니다 (f 및 g와 같은 경우에는 결코 사용하지 못한 이상한 부동 소수점 16 진수 형식). 왜 그런지 모르겠습니다. printf(3)정수 (d, i), 8 진수 (o, U) 또는 16 진수 (x, X)와 같은 다른 숫자 유형 도 지원한다면 좋을 것 입니다.

어쨌든, 같은 0 소수점 정밀도 이중 형식 %.0f또는 %02.0f이 목적을 위해 정수에 가까운 정도입니다.

$ seq-도움말
사용법 : seq [OPTION] ... 마지막
  또는 : seq [OPTION] ... 첫 번째 마지막
  또는 : seq [OPTION] ... 첫 번째 증분 마지막
증가 단계에서 FIRST에서 LAST까지 숫자를 인쇄하십시오.

  -f, --format = FORMAT printf 스타일 부동 소수점 형식 사용
  -s, --separator = STRING STRING을 사용하여 숫자를 구분합니다 (기본값 : \ n).
  -w, --equal-width는 앞에 0으로 채워서 너비를 동일하게합니다.
      --help이 도움말을 표시하고 종료
      --version 출력 버전 정보 및 종료

FIRST 또는 INCREMENT를 생략하면 기본값은 1입니다.
LAST가 FIRST보다 작은 경우에도 생략 된 INCREMENT의 기본값은 1입니다.
FIRST, INCREMENT 및 LAST는 부동 소수점 값으로 해석됩니다.
FIRST가 LAST보다 작 으면 INCREMENT는 일반적으로 양수이며
FIRST가 LAST보다 크면 INCREMENT는 일반적으로 음수입니다.
FORMAT은 'double'유형의 인수 하나를 인쇄하는 데 적합해야합니다.
FIRST, INCREMENT 및 LAST가 모두 고정 소수점 인 경우 기본값은 % .PRECf입니다.
최대 정밀도 PREC를 가진 10 진수, 그렇지 않으면 % g

참조 : http://www.gnu.org/software/coreutils/manual/html_node/seq-invocation.html


{1,50}또는 {01,50}(제로 패딩의 경우)가 훨씬 쉽고 이해하기 쉽습니다.
케빈

1
사실 ... sh보다는 bash를 사용하는 경우. 그래서 @ Random832의 답변을 찬성했습니다. 좋은 대답입니다. seq를 사용하는 것도 유용한 답변입니다.
cas

4

달리, 재귀를 사용하는 POSIX sh 솔루션은 다음과 같습니다.

makedirs() {
  [ "$1" -gt 0 ] || return
  mkdir "s$1"
  makedirs $(( $1 - 1 ))
}
$ makedirs 9
$ ls
s1  s2  s3  s4  s5  s6  s7  s8  s9
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.