今回はコマンドを使ってディレクトリ(フォルダ)を作成します。ですが、わざわざコマンドを使って作成するよりもGUIを使う方が簡単です。特に不都合を感じていないのであればGUIでディレクトリを作成する方がよいでしょう。

でも、場合によってはGUIよりもコマンド入力した方が簡単という事もあります。例えば連番のディレクトリをたくさん作成するような場合や、ディレクトリ内に複数のサブディレクトリをまとめて作成するような場合です。つまりコマンド一発でWebサイト作成時に使うディレクトリとサブディレクトリ(cssやimagesディレクトリなど)が作れてしまうわけです。 他にはテキストファイル内に書かれた内容からディレクトリを作る事もできます。シェルの機能を使えば他にも便利なことがあります。

ディレクトリを作成する

 ディレクトリを作成するコマンドはWindowsのPowerShellでもMacやUbuntuなどUNIX系でも同じmkdirです。単純に決まってる名前のディレクトリを作成するだけなら、このコマンドは使用しているシェルは問いません。なお、PowerShellのmkdirはNew-Item(オプションは-itemType Directory)のエイリアスとして定義されています。

まずはデスクトップにabcという名前のディレクトリを作成してみます。以下のようにコマンドを入力します。

mkdir ~/Desktop/abc

デスクトップに作成されるので、入力したコマンドが正しく動作したかどうか、すぐに分かります。もし、ディレクトリが作成されていない場合は、どこかに作成されてしまったかもしれません。その場合は検索して削除しておきましょう。コマンドで検索するにはfindがありますが、これについては別の機会に。

abcディレクトリの中にdefという名前のサブディレクトリを作る事もできます。UNIX系シェルでは以下のように-pを付けて作成したいサブディレクトリまでのパスを指定するだけです。その前に、先ほど作成したabcディレクトリを削除してから以下のコマンドを実行してください。ちなみに削除しなくてもエラーにはなりません。単に実行結果が正しいかどうかを確認するだけのためです。

mkdir -p ~/Desktop/abc/def

以下のようにすると、defディレクトリ内にさらにghiディレクトリがまとめて作成されます。

mkdir -p ~/Desktop/abc/def/ghi

PowerShellの場合は以下のようにNew-Itemでオプションを指定します。これで深い階層までのディレクトリがまとめて作成されます。PowerShellだとUNIX系のシェルのようにmkdir -p ~/Desktop/abc/defとしてもエラーで動作しません。

New-Item -itemType Directory ~/Desktop/abc/def

連番ディレクトリを作成(Bash, zsh)

 コマンドが威力を発揮するのは連番ディレクトリを作成するような場合です。
 連番のディレクトリを作成する場合はMacやUbuntuなどUNIX系(Bash, zsh)ではmkdir {0..10}のようにします。これで0から10までの連番ディレクトリが作成されます。{ }はブレース展開というシェルの機能です。以下のようにするとデスクトップ上にabcというディレクトリが作成され、そのabcディレクトリ内に0から10までのディレクトリが作成されます。間違って{0..1000}とするとディレクトリだらけになってしまうので、くれぐれも入力ミスをしないように気をつけてください。

mkdir -p ~/Desktop/abc/{0..10}

 連番ディレクトリを作成する場合、使ってるシェルとバージョンが関係してくる事があります。bash 4以降なら簡単にできる事が、そうでない場合は期待通りに処理されない事があるからです。例えば先ほどのコマンドでは0〜10までの連番ディレクトリが作成されましたが、0でなく00、01、02のように先頭に0を付けたいとします。まず、古いMacに搭載されmacOS MojaveまでバージョンアップされなかったBash 3でも使える方法から。ちなみに、この方法はBash 3だけでなくzshでも同じ記述で同じように動作します。

mkdir -p ~/Desktop/abc/0{0..10}

ただし、この方法で作成すると図のようになってしまいます。10でなく010という名前のディレクトリになってしまいます。Bash 4以前だと0を入れて4桁にする(ゼロパディング)ようなことは少し面倒です。まあ、複数コマンドを入力するかシェルスクリプトを利用するといったところでしょうか。これがBash 4やzshだと簡単に桁数を揃えることができます。以下のように{00..10}とするだけです。

mkdir -p ~/Desktop/abc/{00..10}

これは2桁の場合ですが、4桁なら以下のように0を4つ並べるだけです。

mkdir -p ~/Desktop/abc/{0000..10}

10の部分は以下のように4桁にしても結果は同じです。ここらへんはお好みで。

mkdir -p ~/Desktop/abc/{0000..0010}

連番ディレクトリを作成(PowerShell)

 WindowsのPowerShellで連番ディレクトリを作成する場合は以下のようにします。この場合は現在のディレクトリ(カレントディレクトリ)に0から10までの連番ファイルが作成されます。数種類ありますが、書き方のパターンの違いで結果は同じです。

mkdir (0..10)
mkdir (0..10|%{$_})
0..10 | %{mkdir $_}
New-Item -ItemType Directory (0..10)
New-Item -ItemType Directory (0..10|%{$_})
0..10 | %{New-Item $_ -ItemType Directory}

パスを指定する場合は以下のようになります。mkdirの代わりにNew-Item -ItemType Directoryを指定しても同じです。面倒なので2つだけの例で。

mkdir (0..10|%{"~/Desktop/abc/$_"})

  または

0..10 | %{mkdir ~/Desktop/abc/$_}

ただし、上記のようにmkdirのエイリアスを使った場合は自動的に親ディレクトリ、サブディレクトリは作成されませんので以下のようにNew-Itemを使う方がよいかもしれません。まあ、動けばOKということです。

0..10 | %{New-Item -ItemType Directory ~/Desktop/abc/$_}

作成する連番ディレクトリの先頭に0をつけるには以下のようにtoString("00")を使います。toString("0000")なら4桁になります。

0..10 | %{mkdir $_.toString("00")}

 または

0..10 | %{New-Item -ItemType Directory $_.toString("00")}

ちなみに親ディレクトリ、サブディレクトリまでまとめて作成する場合は以下のようにします。

0..10 | %{New-Item -ItemType Directory (Join-Path "~/Desktop/abc/" $_.toString("00"))}

年月日のディレクトリをまとめて作成

 それでは2021年から2025年まで、その年の1〜12月までのディレクトリをまとめて作成します。UNIX系シェルでは以下のコマンド一発で終了です。デスクトップにdataディレクトリを作成して、その中に年ディレクトリを作成、さらにその中に1〜12の連番ディレクトリが作成されます。

mkdir -p ~/Desktop/data/{2021..2025}/{1..12}

 PowerShellの場合は以下のようになります。

2021..2025|%{New-Item -ItemType Directory ~/Desktop/data/$_;cd ~/Desktop/data/$_;mkdir (1..12);}

 1行だと分かりにくいので分解すると以下のようになります。なお、;(セミコロン)はコマンドの区切りです。PowerShellに限らずUNIX系シェルでも同様です。

2021..2025|%{
        New-Item -ItemType Directory ~/Desktop/data/$_;
        cd ~/Desktop/data/$_;
        mkdir (1..12);
}

テキストファイル内容からディレクトリを作成

 今度はテキストファイルの内容からディレクトリを作成します。ここでは現在のディレクトリ内(カレントディレクトリ内)にディレクトリを作成します。テキストファイルはデスクトップ内にあるdataディレクトリにlist.txtを作成します。内容は以下のようにしました。

unix
mac
win
raspberrypi
Linux
FreeBSD
BTRON
Plan9

 cd ~/Desktop/dataと入力してカレントディレクトリを変更します。
 あとはシェルで以下のようにコマンドを入力します。Mac版のPowerShellでも同じコマンドで動作します。

cat ~/Desktop/list.txt| xargs mkdir -p

 Windows版とMac版のPowerShellの場合は以下のようにコマンドを入力します。

cat ~/Desktop/list.txt| %{mkdir $_}

今日の年月日からディレクトリを作成

 ログデータやWebから定期的にダウンロードしたデータを格納するような場合には日付のディレクトリを作成しておくと便利なことがあります。UNIX系ではdateコマンドで日付を取得できるので、以下のようにdateコマンドの実行結果をmkdirのパラメータとして渡すだけです。この場合、現在のディレクトリ(カレントディレクトリ)に年月日のディレクトリが作成されます。

mkdir `date '+%Y%m%d'`

 PowerShellだとGet-Dateコマンドレットを使えば日付を取得できます。Windows版とMac版のPowerShellの場合は以下のようにコマンドを入力します。

Get-Date -Format "yyyyMMdd" | %{mkdir $_}

 Mac版のPowerShellだと以下のようにxargsで日付をコマンドのパラメータとして渡してもOKです。

Get-Date -Format "yyyyMMdd" | xargs mkdir

 原稿書いた日がバラバラなので生成されるディレクトリの日付もバラバラです。が、正しく機能しているのが分かるので、これでOKということで。

著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。