web-dev-qa-db-ja.com

mkdirで複数のディレクトリを一度に作成する方法はありますか?

複数のディレクトリを(同じレベルで)作成し、ディレクトリ名のコンマ区切りリスト(またはそのための何か)を送りたい場合はどうすればよいですか?

109
BGroat

簡潔な答え

mkdirは複数の引数を取り、単に実行します

mkdir dir_1 dir_2
146
Jacob Vlijm

リストを使用してディレクトリを作成すると、かなりワイルドになります。

人々に考えてもらうための例:

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. test01からtest10までの10個のディレクトリ。
  6. 4と同じですが、現在の日付がディレクトリであり、1,2,3が含まれています。
  7. 4と同じですが、現在のユーザーがディレクトリであり、その中に1,2,3があります。

したがって、私がそれを正しく理解し、いくつかのディレクトリを作成し、その中に新しいディレクトリを作成したい場合は、これを行うことができます:

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

sa1、sa2、...、sa10を取得し、各ディレクトリ1、2、3内で取得します。

150
Rinzwind

非常に簡単で、次のようなディレクトリ構造を作成できます。

Websites/
  static/
      cs
      js
  templates/
      html

次のような単一のコマンドで実行できます。

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

スペースを入れないように注意してください

24
anas munir

区切り文字としてコンマの代わりに改行を使用して、目的のディレクトリの名前のリストを作成します。そのリストを保存します。

mkdir `cat list`

これで、リストに名前の付いたすべてのディレクトリができました。

14
SpaceCadet

このようなもの? (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
$ 
8
kos

ディレクトリ名のコンマ区切りリストが必要ですか?それができます。

シェル+ coreutils

誰もがonelinersを投稿しているので、こちらも同様です(mkdir +パラメーター置換+シェルリダイレクト)。

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()関数があり、デフォルトのShellを呼び出し、括弧(文字列でなければなりません)で囲まれたcommand [s]を実行します。

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)を呼び出すこともできますが、名前にスペースを含むディレクトリを作成する場合は問題になる可能性があります

Python

Pythonで同じことを行う方法は、各行を読み取り、末尾の\nを取り除き、すべてを1つのリストに押し込み、リスト項目を反復処理し、リスト項目ごとにdirsを作成します。以下の例では、/home/xieerqi/dirList.txtがファイルに与えられたフルパスであり、文字列/home/username/とリストから読み取ったディレクトリ名を結合することにより、各新しいディレクトリのフルパスを作成します。必要に応じて独自の値に置き換えます

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)
7

mkdirコマンドは、以下のように実行するだけで複数の引数を取ります

mkdir dir1 dir2 dir3 ... dirN

複数のサブディレクトリを作成する場合は、以下に示すように{}でこれらの引数を渡すことができます

mkdir dir1 dir2/{subdir1, subdir2, subdir3, subdirN} dir3 dirN
0
Vijay Sasvadiya