mkdir을 사용하여 한 번에 여러 디렉토리를 만드는 방법이 있습니까?


112

동일한 레벨에서 여러 디렉토리를 만들고 쉼표로 구분 된 디렉토리 이름 목록 (또는 그에 영향을주는 항목)을 제공하려면?


38
man mkdir....
Sparhawk

5
명령이 원하는 작업을 수행 할 수 있는지 알고 싶을 때마다 명령 man이름을 입력하십시오.
David Richerby

@DavidRicherby는 man mkdir"종류"는 여러 디렉토리를 한 번에 만들 가능성을 시사 하지만 구체적으로 언급하지 않았으며 그렇게하는 방법도 없습니다.
Jacob Vlijm

2
@JacobVlijm mkdir에 대한 GNU coreutils 8.21 맨 페이지는 " NAME mkdir- 디렉토리 만들기 // SYNOPSIS mkdir [OPTION] ... [DIRECTORY] ... // DESCRIPTION 디렉토리가 존재하지 않는 경우 디렉토리를 만듭니다." 하나 이상의 디렉토리를 만들 수 있음이 분명합니다.
David Richerby

9
@JacobVlijm 매뉴얼 페이지 전문 용어는 지시 없이는 분명하지 않지만 매뉴얼 페이지의 기술 언어에서는 주어진 인용문에서도 정보가 완전히 명확합니다. ...이후에 주목하십시오 [DIRECTORY]. 즉, 인수를 반복 할 수 있습니다. 그래서 DIRECTORY(ies)모든 통과를 의미 DIRECTORY인수. 그러나 "RTFM"의견은 때때로 배워야 할 표기법을 잊어 버립니다.
Blaisorblade

답변:


147

짧은 답변

mkdir 여러 개의 인수를 취하고 간단히 실행

mkdir dir_1 dir_2

152

목록을 사용하여 디렉토리를 만들 수 있으며 꽤 나빠질 수 있습니다.

사람들이 그것에 대해 생각하게하는 몇 가지 예 :

mkdir sa{1..50}
mkdir -p sa{1..50}/sax{1..50}
mkdir {a-z}12345 
mkdir {1,2,3}
mkdir test{01..10}
mkdir -p `date '+%y%m%d'`/{1,2,3} 
mkdir -p $USER/{1,2,3} 
  1. sa1에서 sa50까지의 50 개 디렉토리
  2. 동일하지만 각 디렉토리는 sax1에서 sax50까지 50 배를 보유합니다 (-p는 존재하지 않는 경우 상위 디렉토리를 작성합니다).
  3. a12345에서 z12345까지의 26 개 디렉토리
  4. 쉼표로 구분 된 목록은 dirs 1, 2 및 3을 만듭니다.
  5. 10 디렉토리 test01를 통해 test10.
  6. 4와 동일하지만 현재 날짜가 디렉토리이고 1,2,3이 있습니다.
  7. 4와 동일하지만 현재 사용자를 디렉토리로 사용하고 1,2,3을 포함합니다.

따라서 내가 올바르게 이해하고 일부 디렉토리를 작성하고 그 안에 새 디렉토리를 작성하려는 경우 다음을 수행 할 수 있습니다.

mkdir -p sa{1..10}/{1,2,3}

sa1, sa2, ..., sa10 및 각 dirs 1, 2 및 3을 얻습니다.


@gniourf_gniourf에 동의합니다 ... 귀하의 답변에 정규식을 사용하지 않습니다. 다른 말을하거나 다른 예를 제시하려고 했습니까?
Slipp D. Thompson

1
@gniourf_gniourf done :)
Rinzwind 2012

3
POSIX 쉘에 정의되지 않은 괄호 확장은 다음과 같습니다. pubs.opengroup.org/onlinepubs/9699919799/utilities/… 예를 들어 Ubuntu dash의 기본값 인 작동하지 않습니다 /bin/sh.
pabouk

7
이 답변은 입력 을 mkdir에 인수로 제공하기 전에 입력을 확장하는 쉘에 달려 있습니다. 그냥 MKDIR 여러 인수를 여러 DIRS을 만들 수 있다는 말을 훨씬 더 정확 주어진 쉘이 더 쉽게 것을 할 수있는 방법에 대해 이야기한다.
deed02392

같은 작업을 수행하려고하면 mkdir sa$(seq 0.1 0.1 1)sa0.1이라는 디렉토리 하나와 나머지 0.2, 0.3, ..., 1을 만드는 것뿐입니다. 전체 목록을 작성하지 않고 십진수 괄호 확장을 어떻게 얻을 수 있습니까?
Plinth

26

매우 간단합니다. 다음과 같은 디렉토리 구조를 만들 수 있습니다.

Websites/
  static/
      cs
      js
  templates/
      html

다음과 같은 단일 명령으로 수행 할 수 있습니다.

mkdir -p Website/{static/{cs,js},templates/html}

공백을 입력하지 않도록주의하십시오


명령을 실행하기 전에 여기에서 tab을 눌러 확장 할 수도 있습니다.
Isaac Gregson

14

구분 기호로 쉼표 대신 줄 바꿈을 사용하여 원하는 디렉토리 이름 목록을 만드십시오. 해당 목록을 저장하십시오.

mkdir `cat list`

이제 모든 디렉토리가 목록에 있어야합니다.


1
그러나,주의해야 할 점은 디렉토리 이름은 하나의 전체 문자열이어야한다는 점입니다. 한 줄이 spaced dir이면 두 개의 dirs spaced와`dir 이 생성됩니다 .
Sergiy Kolodyazhnyy

그래 - - 당신도 성공적으로하거나, 공간에 대한 탈출의 어떤 종류를 할 수없는 junk\ dirlist파일이 디렉토리를 제공 junk\ 하고 dir. \ 디렉토리 이름을 볼 때 공황 상태에 빠졌습니다 .
Jon V

이것은 -p다른 답변에서 언급 한 플래그 와 결합 될 수 있습니다 . 그렇다면 list파일에 상위 디렉토리를 고유 한 행으로 포함시킬 필요가 없으며 자동으로 감지되어 만들어집니다.
mcw0933

8

이 같은? ( printf팁을 위한 muru 덕분에 )

printf '%s' 'foo,bar,baz' | xargs -d, mkdir
$ ls
$ printf '%s' 'foo,bar,baz' | xargs -d, mkdir
$ ls
bar  baz  foo
$ 

사용하기 쉽도록 함수로 묶을 수 있습니다.

function mkdir_cs {
    printf '%s' "$1" | xargs -d, mkdir
}
$ ls
$ mkdir_cs 'foo,bar,baz'
$ ls
bar  baz  foo
$ 

1
그냥은 printf "%s" "$1" | xargs -d, mkdir충분합니다.
muru

7

따라서 쉼표로 구분 된 디렉토리 이름 목록을 원하십니까? 할 수 있습니다.

쉘 + coreutils

모두가 oneliners를 게시하고 있으므로 여기도 있습니다 (mkdir + parameter replacement plus + shell redirection).

DIR:/testdir
skolodya@ubuntu:$ ls

DIR:/testdir
skolodya@ubuntu:$ mkdir $( tr '[,\n]' ' '   < /home/xieerqi/dirList.txt   )                                           

DIR:/testdir
skolodya@ubuntu:$ ls
dirFive/  dirfour/  dirone/  dirthree/  dirtwo/

AWK

AWK는 텍스트 처리 언어이지만 system()기본 쉘을 호출하고 괄호 (문자열이어야 함)로 묶인 명령을 실행하는 매우 훌륭한 기능을 가지고 있습니다.

DIR:/xieerqi
skolodya@ubuntu:$ awk -F ',' '{for(i=1;i<=NF;i++) system("mkdir "$i)}' dirList.txt                                    

DIR:/xieerqi
skolodya@ubuntu:$ ls -ld dir*                                                                                         
-rw-rw-r-- 1 xieerqi xieerqi   23 Feb  9 11:41 dirList.txt
drwxrwxr-x 2 xieerqi xieerqi 4096 Feb  9 11:42 dirone/
drwxrwxr-x 2 xieerqi xieerqi 4096 Feb  9 11:42 dirthree/
drwxrwxr-x 2 xieerqi xieerqi 4096 Feb  9 11:42 dirtwo/

DIR:/xieerqi
skolodya@ubuntu:$ cat dirList.txt                                                                                     
dirone,dirtwo,dirthree

또는 당신은 제거 할 수 ,gsub()기능, 호출 system("mkdir "$0)하지만 당신은 자신의 이름에 공백이있는 디렉토리를 만들려면이 문제가 될 수 있습니다

파이썬

파이썬 같은 방식으로 각 줄을 읽고, 후행을 제거하고 \n, 모든 것을 하나의 목록으로 밀고, 목록 항목을 반복하고 목록 항목 당 dirs를 만드는 것입니다. 아래 예제에서, /home/xieerqi/dirList.txt내 파일에 주어진 전체 경로이며, 우리는 문자열 /home/username/과 목록에서 읽은 dir 이름 을 결합하여 각 새 디렉토리의 전체 경로를 구성 합니다. 필요에 따라 자신의 가치를 대체하십시오

DIR:/testdir
skolodya@ubuntu:$ ls                                                                                                  

DIR:/testdir
skolodya@ubuntu:$ /home/xieerqi/makeDirs.py                                                                           

DIR:/testdir
skolodya@ubuntu:$ ls
dirFive/  dirfour/  dirone/  dirthree/  dirtwo/

DIR:/testdir
skolodya@ubuntu:$ cat /home/xieerqi/makeDirs.py
#!/usr/bin/env python
import os
with open("/home/xieerqi/dirList.txt") as file:
   for line in file:
         for directory in line.strip().rsplit(','):
             path = '/home/xieerqi/testdir/' +  directory
             os.makedirs(path)

3
나는 asker가 실제로 목록이 쉼표로 분리 되기를 원한다고 생각하지 않습니다 . 나는 그것이 구문이 무엇인지에 대한 그들의 추측 일 것이라고 확신합니다.
David Richerby

글쎄, OP는 아마 쉼표로 구분 된 목록을 가지고 있지는 않았지만 방법으로 사용될 수 있습니다. "목록을 사용할 수 있으므로 각 디렉토리의 이름을 개별적으로 입력 할 필요가 없습니다." 특히 큰 목록을 같은 범위로 생성 할 수 없을 때 유용합니다 dir{1..1000}. 예를 들어, 도시와 같이 사용자 이름, 프로젝트 또는 지리적 위치별로 디렉토리를 만들고 싶다
Sergiy Kolodyazhnyy

1

mkdir 명령은 여러 인수를 취하여 아래와 같이 간단히 실행합니다

mkdir dir1 dir2 dir3 ... dirN

여러 개의 서브 디렉토리를 작성하려면 아래에 표시된대로 {}에 해당 인수를 전달할 수 있습니다 (공백없이 인수를 구분하려면 쉼표 만 사용하십시오).

mkdir dir1 dir2/{subdir1,subdir2,subdir3,subdirN} dir3 dirN
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.