ディレクトリをコピーアンドペーストして、
フォルダ名を微妙に変えていきたい場合ってありますよね。
例えば、dir1というディレクトリがあった場合に、
これをコピーアンドペーストしてdir1_copyを作り、
さらに名前を変更してdir2にする。
次に、もう一度dir1をコピーアンドペーストしてdir1_copyを作り、
さらに名前を変更してdir3にする。
・
・
・
こんなことを手動でやっていては、
時間がもったいなさすぎます。
そこで、bashやzshを利用して、
シェルスクリプトによって自動化する方法をお教えします。
これらは、コンピュータを扱う上で非常に重要なものです。
この記事を読んで、一歩進んだ知識を身につけましょう!
Contents
bashでディレクトリ構造をコピー ペースト!for文で変数を回す初心者向けの説明
そもそもbashとは何か?.bashrcや.bash_profileを使う
bashとは何か?、については、以前解説しました↓
意外とあいまいになりがちだと思うので、ぜひご覧になってみてください。
bashの設定を毎回手で入力するのは面倒ですよね?
例えば、これから先何回も使うような新しい変数を設定したい場合。
毎回それを手で打ち込んでいたのでは、らちがあきません。
そこで、欲しい設定を全て一箇所にまとめて書いておけば、そのファイルを実行するだけで欲しい環境が整うわけです。
.bashrcや.bash_profileは、欲しい設定を全て書いておくためのファイルです。
.bashrcや.bash_profileに関しては、
こちらの記事で詳しく解説しています。
シェルスクリプトを基本の基本から入門
本記事では、
シェルスクリプトを用いてディレクトリをコピー、ペーストする方法をわかりやすく解説しています。
では、そもそもシェルスクリプトとはなんでしょうか?
シェルスクリプトが使えるようになると、
エンジニアとしての幅が大きく広がります。
シェルスクリプトに関しては、以下の記事で詳しく解説しています。
bashでディレクトリ構造をコピーペーストするシェルスクリプト
では、実際にディレクトリをコピーペーストするシェルスクリプトを見ていきましょう。
まず、現在のディレクトリの下には、dir1というディレクトリがあるとします。
このdir1をコピーペーストして、
dir2, dir3, dir4, …, dir10
を作りたいとしましょう。
このためには、ディレクトリをコピーするコマンドとして、
cp
を用いればいいですね。
cpのオプションとして、ディレクトリを操作するための
-r
を指定する必要があります。
引数は二つあって、
1つめはコピーしたい対象のディレクトリ、
2つめはペーストしたあとのディレクトリ名
を指定します。
したがって、現在のディレクトリ下にあるdir1をコピーする場合は、
cp -r dir1
であり、さらにペーストしたあとの名前をdir2とする場合は、
cp -r dir1 dir2
とすればよいことがわかります。
さらに、dir2, dir3, …, dir10 を作りたい場合には、
cp -r dir1 dir2
cp -r dir1 dir3
・
・
・
cp -r dir1 dir10
というコマンドを入力すれば良いことになりますね。
しかし、これを手で入力していては、あまりに時間がもったいないです。
そこで、シェルスクリプトを書くことでこれを自動化したいですね。
シェルスクリプトの基本中の基本、for文を使ってみましょう。
もしもシェルスクリプトに馴染みが無い場合は、
まず以下の記事を読んでみて下さい。
さて、
さきほどのコピーペースト操作をシェルスクリプトで実装する場合には、
どのようなプログラムを書けばよいでしょうか。
for 文を使ってある変数を走らせていき、
その変数名を使ってペースト先のディレクトリ名を記述すれば良いですね。
例えば、変数名をi とすれば、
for i in <<iが走る範囲>>
do
<<ディレクトリをコピーする操作>>
done
というプログラムを書けば良いですね。
今回の場合ですと、生成したいディレクトリ名は
dir2, dir3, …, dir10
でした。
したがって、
ペーストするディレクトリ名はdir”$i”とすればよいですね。
i=2のときはdir2が、
i=3のときはdir3が、
・
・
・
i=10のときはdir10が、それぞれ生成されます。
では、iの動く範囲を指定するにはどうすればよいでしょうか?
seq文を使えば良いですね。
seq文はシェルスクリプトの基本中の基本です。
もしもシェルスクリプトに馴染みが無い場合は、
まず以下の記事を読んでみて下さい。
seq文は、
1からある数字までの値を1ずつ増加させていくときに使います。
たとえば、
for i in seq 10
と書けば、iという変数が1から10まで動くわけですね。
これを先程のプログラムと組み合わせると、
for i in seq 10
do
<<ディレクトリをコピーする操作>>
done
となりますね。
さて、
<<ディレクトリをコピーする操作>>
の部分ですが、
cp -r dir1 <<i番目のディレクトリ>>
の形式で書けばいいですね。
そkで、
数値が格納された変数であるi(=2)から、
文字列であるdir2をつくる必要があります。
そのためには、
dir”$i”
とすればよいです。
しかし、いまiが走る範囲は1から始まって10で終わります。
i=1のとき、
dir”$i”
は
dir1
に対応します。
いま、
i=1,2,…,9
に対応して
dir2, dir3, …, dir10
を生成したいとすると、
i=1のときdir2を指定する必要がありますね。
そこで、
cp -r dir1 dir”$(($i+1))”
とする必要があります。
こうすれば、
i=1のとき、
dir1をdir2としてコピーする
ことができます。
以上より、
for i in seq 9
do
cp -r dir1 dir”$(($i+1))”
done
とすれば、
dir1をdir2, dir3, …, dir10にコピーできます。
注意:
seq 9の前後にバッククウォートが必要ですが、
お使いのブラウザによっては表示されていないかもしれません。
いま読むべき記事
本ブログでは、pythonをはじめとしたプログラミングの情報などを、分かりやすく発信しています。
ぜひ、他の記事もご覧になってみてください。
コメント