Bashには便利な自動化機能があり、Linuxでのファイル操作が楽になりました。
Bashコマンドラインを使ってタスクを自動化することは、物事を成し遂げるための優れた方法です。Linuxをサーバーで使ってログファイルやその他のファイルを管理する場合でも、PC上のファイルを整理してデスクトップをすっきりさせる場合でも、Bashの自動化機能を使えば作業がずっと楽になります。
文書タスクの自動実行
複数のファイルを同時に処理し、各ファイルに対して同じ操作を行いたい場合は、for コマンドを使用します。このコマンドはファイルのリストを走査し、1つ以上のコマンドを実行します:
for リスト内の変数コマンド
例では、forコマンドのさまざまな部分を区切るために、余分な空白と改行を追加しています。コマンドラインで複数のコマンドを同時に実行することはできないように思えるかもしれませんが、;を使ってすべてのコマンドを同じ行にまとめることができます。
for リスト内の変数; do ; done
実際に使ってみましょう。私はいくつかのファイルの名前を変更するためにforコマンドを使っています。最近、名前を変えたいスクリーンショットがいくつかありました。これらのスクリーンショットはfilemgr.pngやterminal.pngという名前で、それぞれの名前の前にscreenshotを付けたいのです。forコマンドを使えば、一度に30個のファイル名を変更することができます。以下は2つのファイルの例です:
filemgr.png terminal.png$ for f in *.png ; do mv $f screenshot-$f ; donescreenshot - filemgr.foo & nbsp; screenshot - terminal.foo;
forコマンドを使うと、一連のファイルに対して1つ以上の処理を簡単に実行できます。imageやscreenshotのような意味のある変数名を使うこともできますし、例にある「省略形」変数fを使うこともできます。 forループを使ってスクリプトを書くときは、意味のある変数名を選びます。しかし、コマンドラインでforを使うときは、通常、fileはf、directoryはdといったように、省略した変数名を選びます。
どのような変数名を使用する場合でも、変数を参照する際には必ず $ 記号を追加してください。これにより、変数が作業中のファイル名に展開されます。for コマンドの詳細については、Bash プロンプトで help for と入力してください。
条件による実行: if
forループを使ってファイルを巡回するのは、各ファイルに対して同じ処理を行う必要がある場合に便利です。しかし、あるファイルに対して異なる処理を行う必要がある場合はどうでしょうか?そのためには、if文を使って条件付きで実行する必要があります:
コマンド
if文やelse文を使って判断することもできます:
コマンドコマンド
if文、elif文、else文は、より複雑な手続きにも使えます。私は、一度に多くのファイルを自動化する必要があるときに、スクリプトでこれらを使用します:
コマンドelifコマンドelifコマンドコマンド
ifコマンドを使うと、ファイルがファイルであるかどうか、ファイルが空であるかどうかなど、さまざまな判定を行うことができます。コマンドラインでhelp testと入力すると、if文を使って実行できるさまざまなテストをすぐに見ることができます。
例えば、何十ものファイルを含むログディレクトリを整理したいとします。ログ管理の一般的な作業は、空のログファイルをすべて削除し、他のログを圧縮することです。この問題を解決する最も簡単な方法は、空のファイルを削除することです。正確にマッチするifテストはありませんが、ファイルかどうかを判断し、ファイルが空でないと判断する-sオプションがあります。これは望んでいることと正反対ですが、! を使うことで、ファイルでないか空であるかどうかを判定するテストを無効にすることができます。
そのプロセスを例で見てみましょう。つのテスト・ファイルを作成しました。1つは空で、もう1つはいくつかのデータを含んでいます。ファイルが空の場合、if判定を使ってemptyというメッセージを表示することができます:
datafile emptyfile$ if [ ! -s datafile ] ; then echo "empty" ; fi$ if [ ! -s emptyfile ] ; then echo "empty" ; fi
ifコマンドとforコマンドを組み合わせることで、ログファイルリストに空のファイルがないかチェックし、削除することができます:
$ ls -ltotal 20-rw-rw-r--. 1 jhall jhall 2 Jul 1 01:02 log.1-rw-rw-r--. 1 jhall jhall 2 Jul 2 01:02 log.2-rw-rw-r--. 1 jhall jhall 2 Jul 3 01:02 log.3-rw-rw-r--. 1 jhall jhall 0 Jul 4 01:02 log.4-rw-rw-r--. 1 jhall jhall 2 Jul 5 01:02 log.5-rw-rw-r--. 1 jhall jhall 0 Jul 6 01:02 log.6-rw-rw-r--. 1 jhall jhall 2 Jul 7 01:02 log.7$ for f in log.* ; do if [ ! -s $f ] ; then rm -v $f ; fi ; doneremoved 'log.4'removed 'log.6'$ ls -ltotal 20-rw-rw-r--. 1 jhall jhall 2 Jul 1 01:02 log.1-rw-rw-r--. 1 jhall jhall 2 Jul 2 01:02 log.2-rw-rw-r--. 1 jhall jhall 2 Jul 3 01:02 log.3-rw-rw-r--. 1 jhall jhall 2 Jul 5 01:02 log.5-rw-rw-r--. 1 jhall jhall 2 Jul 7 01:02 log.7





