ファイル・ディレクトリの一括作成
ディレクトリを一度に複数作成する
ファイルを複数のディレクトリに分けたい場合など、ディレクトリを一度に複数作成したいことがあると思います。作成したいディレクトリ名を中括弧「{
」「}
」で囲い、「,
」区切りの指定をすることで作成できます。
次の例では、「home」「lib」「bin」という名前のディレクトリを一度に作成しています。
$ ls ← ディレクトリは空 $ mkdir ./{home,bin,lib} $ ls bin/ home/ lib/
ディレクトリ名に対して部分的に中括弧を利用した、次のような指定も可能です。
$ mkdir dir{1,2,3} $ ls dir1/ dir2/ dir3/
また、一度に多階層のディレクトリを作成する場合には、mkdir
コマンドに「-p
」オプションを付けます。
$ mkdir -p dir1/dir2/dir3 $ find * dir1 dir1/dir2 dir1/dir2/dir3
mkdir
コマンドの「-p
」オプションと中括弧を組み合わせると、次のようなディレクトリ構成も一度に作成可能です。
$ mkdir -p ./{lib,src,doc/{html,pdf,txt}} $ find * doc doc/html doc/pdf doc/txt lib src
上記の例は、「lib」「src」「doc」という名前のディレクトリを作成し、さらに「doc」ディレクトリ以下に、「html」「pdf」「txt」という名前のディレクトリを作成しています。
シェルの制御構文を利用してディレクトリを一度に複数作成する
より多くのディレクトリを作成する必要がある場合は、シェルの制御構文を利用して次のように指定できます(ファイルを作成したい場合は、mkdir
コマンドをtouch
コマンドなどに置き換えてください)。
$ for ((i=1; i<=5; i++)); { mkdir "test$i"; } $ ls test1/ test2/ test3/ test4/ test5/
ただし上記の方法は、ループの回数だけmkdir
コマンドが呼び出されるため、処理速度が遅くなります。より速くディレクトリを作成したい場合は、xargs
コマンドを利用して次のように指定することが可能です。
$ for ((i=1; i<=5; i++)) { echo "test$i "; } | xargs mkdir $ ls test1/ test2/ test3/ test4/ test5/
「"test$i (空白)"
」となっていることに注意してください。あらかじめecho
コマンドでディレクトリ名を出力しておき、mkdir
コマンドを一度だけ実行させることで処理速度を速めています。xargs
コマンドに関しては第1回を参考にしてください。
なおbash 3.0以降であれば、次のように中括弧を利用することで、さらに高速にディレクトリを作成できます。
$ mkdir test{1..5}
bash 3.0以降では{開始(数字or英字)..終了(数字or英字)}
と指定すると、連続的な表現として扱ってくれます。このため、連番ファイルが生成されます。
ゼロパディングした名前のディレクトリを一度に複数作成する
ファイル名・ディレクトリ名の長さを揃えて管理したい場合には、ゼロパディング(ゼロ埋め)を行うのが便利です。
「dir001」「dir010」「dir100」のような名前のディレクトリを作りたい場合は、printf
コマンドを利用して、次のように指定できます(ファイルを作成したい場合は、mkdir
コマンドをtouch
コマンドなどに置き換えてください)。
$ for ((i=1; i<=5; i++)) { printf "test%03d " $i; } | xargs mkdir
bash 3.0以降では、次の指定も可能です。
$ for i in {1..5}; { printf "test%03d " $i; } | xargs mkdir $ ls dir001/ dir002/ dir003/ dir004/ dir005/
「"test%03d (空白)"
」となっていることに注意してください。printf
コマンドは、C言語のprintf
関数のように、指定のフォーマットで文字列を出力するコマンドです。「%03d
」と指定すれば、3桁でゼロパディングされます。
シンボリックリンクのファイルを一括で作成する
シンボリックリンクのファイル名を置き換えても、リンク元のファイル名は変更されません。シンボリックリンクのファイルを作成するには、ln
コマンドと「-s
」オプションを利用するのが一般的です。
$ ln -s [リンク元ファイル] [リンクファイル]
しかし、シンボリックリンクのファイルを一括で作成するには、cp
コマンドが便利です(FreeBSDは、cp
コマンドは未対応)。
$ cp -rs [リンク元ファイル] [リンクファイル]
「-r
」オプションでディレクトリを再帰的にコピーして、「-s
」オプションでシンボリックリンクファイルを作成しています。
例えば ホームディレクトリに存在する「tmp」ディレクトリへ、「tmp2」という名前でシンボリックリンクを作るには、チルダ展開を利用すれば次のように指定できます。
$ cp -rs ~/tmp ~/tmp2