ウェブサイト検索

Linux で Bash を使用してタスクを自動化する方法


Bash には、Linux 上でファイルを操作する際の作業を楽にしてくれる便利な自動化機能がいくつかあります。

Bash コマンド ラインは、タスクを自動化する優れた方法です。サーバー上で Linux を実行していてログ ファイルやその他のデータを操作する必要がある場合でも、単にファイルを整理しておきたいだけのデスクトップ ユーザーでも、Bash のいくつかの自動化機能を使用して作業を容易にすることができます。

コマンド用 Linux: ファイルに対するタスクを自動化する

一度に作業するファイルが多数あり、すべてのファイルに対して同じことを行う必要がある場合は、for コマンドを使用します。このコマンドはファイルのリストを反復処理し、1 つ以上のコマンドを実行します。 for コマンドは次のようになります。

for variable in list
do
    commands
done

for コマンドのさまざまな部分を分離しやすくするために、そこにスペースを追加しました。この複数行のコマンドをコマンド ラインで実行するのは難しそうに見えますが、次のように ; を使用してすべてを 1 行にまとめることができます。

for variable in list ; do commands ; done

実際に見てみましょう。 for コマンドを使用する方法の 1 つは、多数のファイルの名前を変更することです。最近、名前を変更したいスクリーンショットが大量にありました。スクリーンショットには filemgr.pngterminal.png などの名前が付いていたため、代わりに各名前の前に screenshot を追加したいと考えました。 1 つの for コマンドを実行して、30 個のファイルの名前を一度に変更しました。以下は 2 つのファイルだけの例です。

$ ls
filemgr.png  terminal.png
$ for f in *.png ; do mv $f screenshot-$f ; done
$ ls
screenshot-filemgr.png  screenshot-terminal.png

for コマンドを使用すると、一連のファイルに対して 1 つ以上のアクションを簡単に実行できます。 imagescreenshot など、自分にとって意味のある変数名を使用することも、f のような「省略形」変数を使用することもできます。 、私の例でやったように。 for ループを使用するスクリプトを作成するときは、意味のある変数名を使用するようにしています。ただし、コマンド ラインで for を使用する場合は、通常、ファイルには f、ディレクトリには d のような短い変数名を使用します。 。

変数にどのような名前を選択する場合でも、コマンド内で $ を使用して変数を参照してください。これにより、変数が操作対象のファイルの名前に展開されます。 for コマンドの詳細を確認するには、Bash プロンプトで「help for」と入力します。

Linux の条件付き実行 (if)

for を使用して一連のファイルをループすると、すべてのファイルに対して同じことを行う必要がある場合に役立ちます。しかし、特定のファイルに対して何か別のことを行う必要がある場合はどうすればよいでしょうか?そのためには、if ステートメントによる条件付き実行が必要です。 if ステートメントは次のようになります。

if test
then
    commands
fi

else キーワードを使用して、if/else テストを実行することもできます。

if test
then
    commands
else
    commands
fi

より複雑な処理の場合は、if/else-if/else 評価を使用できます。ファイルのコレクションを一度に処理するジョブを自動化する必要がある場合、これをスクリプトで使用できます。

if test
then
    commands
elif test2
then
    commands
elif test3
then
    commands
else
    commands
fi

if コマンドを使用すると、 ファイルが本当にファイルであるか、 ファイルが空 (ゼロ) であるかなど、さまざまなテストを実行できます。サイズ)。 Bash プロンプトで「help test」と入力すると、if ステートメントで使用できるさまざまな種類のテストが表示されます。

たとえば、数十のファイルが含まれているログ ディレクトリをクリーンアップしたいとします。ログ管理における一般的なタスクは、空のログを削除し、他のログを圧縮することです。これに対処する最も簡単な方法は、空のファイルを削除することです。これに正確に一致する if テストはありませんが、何かがファイルであるかどうかをテストするための -s ファイルがあります。 > ファイルが空でない場合(サイズがある場合)。これは私たちが望んでいることとは逆ですが、! を使用してテストを無効にして、何かがファイルでないか空であるかどうかを確認することができます。

これが実際に機能する例を見てみましょう。 2 つのテスト ファイルを作成しました。1 つは空で、もう 1 つはデータが含まれています。 if を使用すると、ファイルが空の場合に「empty」というメッセージを出力できます。

$ ls
datafile  emptyfile
$ if [ ! -s datafile ] ; then echo "empty" ; fi
$ if [ ! -s emptyfile ] ; then echo "empty" ; fi
empty

これを for と組み合わせてログ ファイルのリストを調べ、空のファイルを削除できます。

$ ls -l
total 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 ; done
removed 'log.4'
removed 'log.6'
$ ls -l
total 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

if コマンドを使用すると、スクリプトにインテリジェンスを追加して、必要な場合にのみアクションを実行できます。ファイルがシステム上に存在するか存在しない、 またはスクリプトのエントリをテストする必要がある場合、スクリプトで if をよく使用します。調べているのはファイルまたはディレクトリです。 if を使用すると、スクリプトが必要に応じてさまざまなアクションを実行できるようになります。

関連記事: