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


112

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


38
man mkdir....
Sparhawk

5
コマンドで実行したいことができるかどうかを知りたいときはいつでも、コマンドmanの名前を入力します。
デビッドリチャービー16

@DavidRicherbyは、man mkdir「種類」は一度に複数のディレクトリを作成する可能性を示唆していますが、具体的にも、その方法についても言及されていません。
ジェイコブVlijm 16

2
@JacobVlijm mkdirのGNU coreutils 8.21マンページには、「名前 mkdir- ディレクトリの作成// 概要 mkdir [オプション] ... [ ディレクトリ] ... // 説明存在しない場合はディレクトリを作成します。」これは、複数のディレクトリを作成できることは明らかです。
デビッドリチャービー16

9
@JacobVlijmのマニュアルページの専門用語は、指示なしでは明白ではありませんが、マニュアルページの技術的な言語では、情報は与えられた引用でも完全に明確です。...after [DIRECTORY]に注意してください。これは、引数を繰り返すことができることを意味します。したがってDIRECTORY(ies)、渡されたすべてのDIRECTORY引数を指します。ただし、「RTFM」コメントでは、学習する表記法があることを忘れる場合があります。
ブレイザーブレード

回答:



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を取得し、各ディレクトリ1、2、3内で取得します。


@gniourf_gniourfに同意します…あなたの答えには正規表現の使用法はありません。別のことを言ったり、別の例を提供したりするつもりでしたか?
スリップD.トンプソン

1
@gniourf_gniourf done :)
Rinzwind

3
POSIXシェルで定義されていないブレース拡張に言及する価値があります:pubs.opengroup.org/onlinepubs/9699919799/utilities/…たとえば、Ubuntu dashのデフォルトでは機能しません/bin/sh
-pabouk

7
この答えは、シェルが入力をmkdirの引数として提供する前に入力を展開することに依存しています。mkdirが複数の引数を持つ複数のディレクトリを作成できると言ってから、指定されたシェルがそれをどのように簡単にするかについて話す方がはるかに正確です。
deed02392

のようなことをしようとするmkdir sa$(seq 0.1 0.1 1)と、sa0.1という名前のディレクトリを1つ作成し、残りの0.2、0.3、...、1を作成するだけです。リスト全体を書かずに小括弧を展開するにはどうすればよいですか。
台座

26

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

Websites/
  static/
      cs
      js
  templates/
      html

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

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

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


コマンドを実行する前に、ここでタブを押して展開することもできます。
アイザックグレッグソン

14

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

mkdir `cat list`

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


1
はい、ただし、これは機能しますが、注意が必要です-ディレクトリ名は1つの文字列でなければなりません。1行がの場合spaced dir、2つのdirs spacedと `dir が作成されます。
セルギーコロディアズニー16

うん- -あなたも成功したのいずれか、スペースのエスケープのいずれかの種類を行うことができないjunk\ dirlist、ファイル2つのディレクトリを与え、junk\ そしてdir\ ディレクトリ名にを見つけたときにパニックになりました。
ジョンV

これは-p、他の回答に記載されているフラグと組み合わせることができます。その場合、listファイルには親ディレクトリを独自の行として含める必要はなく、自動的に検出されて作成されます。
mcw0933

8

このようなもの?(ヒントをくれたmuruに感謝printf

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で十分なはずです。
ムル

7

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

シェル+ 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)

3
私は、質問者が実際にリストをコンマ区切りにすることを望んでいないと思います。これは、構文がどのようなものであるかについての彼らの推測に過ぎないと確信しています。
デビッドリチャービー16

まあ、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.