SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

業務でラクするためのUNIXテクニック集

ファイル・ディレクトリ名の一括置換/一括作成
業務で楽するためのUNIXテクニック集

第2回


  • X ポスト
  • このエントリーをはてなブックマークに追加

ファイル・ディレクトリの一括作成

ディレクトリを一度に複数作成する

 ファイルを複数のディレクトリに分けたい場合など、ディレクトリを一度に複数作成したいことがあると思います。作成したいディレクトリ名を中括弧「{」「}」で囲い、「,」区切りの指定をすることで作成できます。

 次の例では、「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

次のページ
ファイル名・ディレクトリ名の一括置換

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
業務でラクするためのUNIXテクニック集連載記事一覧

もっと読む

この記事の著者

保田和隆(ヤスダカズタカ)

Yasuda Kazutakaネットワーク関連の組み込みソフトウェア開発者。http://uguisu.skr.jp/Windows/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2954 2009/06/04 09:52

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング