フリーウェアでシミュレーション結果アニメーションを作る

コマンドラインのススメ

<< Prev - Index - Next >>

1. Bashを使おう

1.1 bash


■ LINUX/UNIX 系の OS は、Windows と違ってコマンドを入力してコンピューターに何かさせることが多いです。
(かなり昔からwindowsを使っている人は、DOS窓でコマンドラインを使ったことのある人も多いかも知れません)

■ Windows の通常の使い方に慣れている人にはとっつきにくいですが、逆に手で作業するには面倒すぎるような作業も、コマンド入力で簡単にできる場合もあります。

■ コマンドを走らせるための大元のプログラム(シェル)にも種類があるのですが、bash はメジャーなシェルの一つです。



■ 昔ながらのDOS窓では機能がかなり限定されてしまうので、LINUX/UNIXに近い操作を行う cygwin というものが開発されています。Windows の上で動く LINUX/UNIX 的なもので、 bash の他相当な数の LINUX/UNIX 用のツールが使えます。

■ ここでは bash をベースに話を進めていきます。普段から LINUX/UNIX を使っていて、他のシェルを使っている人も、若干コマンドが違うぐらいで充分に対応できるでしょう。


1.2 必要なら cygwin のインストール


■ Windows ベースのユーザーの場合は、まず cygwin を導入する必要があります。それなりに時間がかかるので、できれば予め済ましておきたい作業です。

http://www.cygwin.com/
(2013年初頭時点でver1.7.25が最新。ただし以下の記事は2010年頃に書いた物なので少し古いかもしれません)

setup.exe がインストーラーです。ダウンロードして適当な場所に置き、実行するとインストールがされる…訳ではなくて、インストールの準備をします。このとき、日本語や空白が含まれたフォルダを使わないのが無難です。

■ cygwin 自体で、一つのOSのかなりの部分の機能をもっているので、かなり巨大です。WWW経由でのインストールをするので、回線のできるだけ太い場所でインストールしましょう。

■ 最初の選択画面では Install from Internet を選びます。



■ デフォルトのインストールでは c:/cygiwin 以下のフォルダが cygwinの支配領域になります。Windowsの中のこの一角を借りて、LINUX/UNIX 的な OS(のようなもの)が動くことになります。

■ c ドライブの容量にもう余裕が無いというときには d:/cygwin などに変更してもいいでしょう。

■ その後、ダウンロードしたファイルをどこに置くか、ウェブへの接続の仕方はどうするか、など聞かれますが、普通はそのままで大丈夫です。


■ どこからダウンロードするかの選択です。海の向こうから細い回線でダウンロードすると、大変なことになるので、日本で回線の太そうな場所を選びます。



■ 最後に何をインストールするかです。全部インストールとすると、LINUX/UNIXでの定番ツールなどがどかどかインストールされて本気で大変な量になります。多くは Windows 版の似たツールなどが存在するので、デフォルト状態で良いでしょう。

setup.exe は本体のインストール後にも欲しいツールの追加インストールができます。必要になったら追加するのが現実的でしょう

数多くのパッケージから目的のパッケージを探すのは大変ですが、右上のViewボタンでカテゴリー別表示や一覧表示の切り替えができるので、うまく使いましょう。
(今回の内容には、perl と imagemagick はあると何かと便利なので入れておきます。imagemagickは既にwindows用が入っていれば再度入れる必要はありません)

インストールが成功すれば、デスクトップ上にできる cygwin アイコン(インストーラと一緒の形のアイコンです)で起動します。



■ Windowsのフォルダ構成の中で、
c:\cygwin\home\ユーザ名Bash.html 
がユーザーの自由に使う領域になります。pwdコマンドで現在いるフォルダを表示すると。
/home/ユーザ名
と表示されるでしょう。
Windows上に間借りしている C:/cygwin の部分は cygwin 内からは見えずに、/ から始まる LINUX/UNIX的なフォルダ構造をしています。※

ls コマンドでファイル名やフォルダ名が表示されます。もちろん Windows上 で動いているので、普通にエクスプローラーで見ることもできます。


■ 日本語のユーザ名でホームディレクトリが日本語だと、残念ながら多くの局面でトラブルを引き起こすことが予想されます。

/home/yourname

などの英語のフォルダを作って、そこを自分のホームディレクトリとして利用したほうがいいと思います。
(本来はそれにあわせて設定ファイルを書き換えて…などとすると良いのですが、LINUX/UNIX的な環境に慣れてさまざまな変更ができるようになったら、で良いでしょう。)

※) cygwin での フォルダの区切りは / です。 DOSでは \ だったのでDOSの経験のある人は注意が必要です!


1.3 bash の基礎的コマンド

■ LINUX/UNIX系のユーザーなら日ごろから使い慣れたコマンドですが、コマンドラインを普段使っていない人には敷居が高いです。資料を見ながらでも使いこなせるようにならないといけません。

pwd今いるフォルダ名を表示する
lsファイル名やフォルダ名を表示する
cdフォルダを移動する 例1) cd Visualization
例2) cd ../ (一つ上のフォルダは ../ と表記する)
catファイルの中身(テキスト)を表示する例) cat memo.txt
echo入力した文字列をそのまま表示する例) echo abc
cpファイルをコピーする例) cp aaa.txt aaa_copy.txt
mvファイルの名前を変える例) mv from.txt to.txt
rmファイルを消去する(注意)例 rm oldmemo.txt
mkdirフォルダを作る例) mkdir NewFolder
rmdirフォルダを消去する例) rmdir OldFolder

■ * や ? は、ある条件を満たすファイルを意味するワイルドカードとして使えます。*.txt だと、.txt 拡張子が付いているファイルを意味します。

ls *.txt .txt 拡張子が付いているファイルのみ表示
rm *.jpg .jpg 拡張子が付いているファイルのみ削除
rm * 全部削除(取り扱い注意!!)
ls file???.bmp file000.bmp や file001.bmp のように?の部分に何か入るファイルのみ表示

■ > 記号は、コマンドの結果の表示をファイルに書き出します。 >> だと追加書き出しです。

echo abc > test.txt abcと表示する代わりに、text.txt(中身はabc)を作る
ls > files.txt ファイル一覧を files.txt というファイルに書き込む
echo def >> test.txt files.txtの中身にさらに def を追加する

■ | 記号は、コマンドの結果をさらに別のコマンドに受け渡します。
例えば、grep というコマンドは 「ある文字列のある行だけを表示する」というコマンドですが、

cat document.txt | grep adress document.txt の中身の表示を | によってgrep に渡して adress という文字のある行だけ表示する。

というようにコマンドを組み合わせて色々なことをすることができます。


1.4 bash でループしよう

■ コマンドラインの利点の一つは、手でやるのが余りにも面倒臭い作業を短いコマンドで行えるということです。

特に、連番のシミュレーションデータを処理するなどというときには、繰り返し(ループ)処理ができるのとできないので大違いになります。

■ bash で繰り返しを実現するには for 〜 in 〜 ;do 〜 ; done を使います。例として

$ for f in 1 2 3 4 5 ; do echo $f ; done
を実行すると
1
2
3
4
5
と表示されます。forの後に来る文字列(この場合f)に1 2 3 4 5 が順番に代入され、do の後のコマンドの中で $ 付き(この場合$f)として使えます。

■ しかし、100個も200個も処理したいときに for f in 1 2 3 ...... と手で入力するのも馬鹿ばかしい話です。

bash には、コマンドをバッククォート` `で括ると、そのコマンドの実行結果を利用するというルールがあります。

■ そこで、連番の数字を表示する seq というコマンドと組み合わせてみます。

$ seq 1 5
を実行すると、
1
2
3
4
5
と同じように表示されます。このコマンドを` `の中で使えば簡単に連番の処理ができます。
例えば、imagemagickの中に含まれる、画像のフォーマットを変換する convert というコマンドと組み合わせてみると次のような例になります。

$ for f in `seq -f %03g 1 100` ; do convert image${f}.png image${f}.jpg; done

これを実行すると、順番に

image001.png を image001.jpg に変換
image002.png を image002.jpg に変換
....

と100まで繰り返してくれます。

○ seq コマンドの -f の部分は表示の仕方のオプション:%03g で 0つきの3桁の表示を意味する。

○ ${f}のように変数を { } で括っているのは安全のため: $abc が $abc なのか $a+bc なのか区別がつかないような場合があるときは、${a}bc のように{ }で括って区切りを知らせてやる。間違いようの無いとき以外は{ }を使うのが安全。



1.4.1 MacOS(BSD)の場合はjot

■ MacOSX を含む BSD系のOS には seqコマンドが無いようです。代わりに jotコマンドが存在するのでそちらを使います。ただし、文法が微妙に違うようです。
seq FIRST [INCREMENT] LAST
FIRSTからLASTまで、INCREMENT 間隔で表示する。
$ seq 0 2 10 
0 2 4 8 10 が表示される

jot REPS [BEGIN] [END]
BEGINからENDまでREPS個の要素を表示する。
$ jot 5
$ jot 5 20 100
1から5まで表示される
20 40 60 80 100 が表示される


1.5 ループのおまけ

■ ループ処理を間違えると、下手をすると間違ったまま何千コマンドも実行される可能性があるので、実行前に慎重に確認する必要があります。そういうときには単に表示だけする echo コマンドが役に立ちます。

$ for f in `seq -f %03g 1 100` ; do echo convert image${f}.png image${f}.jpg; done

convert image001.png image001.jpg
convert image002.png image002.jpg
convert image003.png image003.jpg
convert image004.png image004.jpg
convert image005.png image005.jpg
convert image006.png image006.jpg
convert image007.png image007.jpg
....

■ 間違ってないなと確認してから echo を消去して実際に実行すると(特にファイル消去とか間違えると大変なコマンドなどは)、随分事故の可能性が減るでしょう。


<< Prev - Index - Next >>
inserted by FC2 system