今回は、Linuxのコマンドの使い方とシェルスクリプトについて説明します。
Linuxを効率的に操作するためには、コマンドの基本を理解し、シェルスクリプトを活用することが重要です。本記事では、Linuxのコマンドの使い方とシェルスクリプトの基礎について解説します。
基本的なファイル操作から、実践的なスクリプトの作成方法まで、初心者にもわかりやすく説明します。Linuxの操作を自動化し、作業を効率化するための第一歩として、参考にしてください。
ぜひ、最後までご覧いただけると嬉しいです!
Linuxの基本コマンド
Linuxはコマンドライン操作が基本となるOSであり、さまざまな作業をターミナル上で実行できます。特に基本的なコマンドを習得することで、ファイル操作やシステム管理を効率的に行えるようになります。本記事では、Linuxを使用する上で知っておきたい基本コマンドを紹介します。
0. 端末(ターミナル)の起動方法
まずは、端末(ターミナル)の起動方法について説明します。
VirtualBoxを起動して、前回インストールしたDebian Linuxを起動します。ログイン後、左上のアクティビティを選択します。

Dockの右端にある「アプリケーションを表示する」を選択します。

「端末」を選択します。

端末(ターミナル)が起動します。

以上で、端末の起動方法の説明は以上になります。
1. ディレクトリ操作
pwd
:現在のディレクトリを表示
例:pwd

ls
:ディレクトリ内のファイルやフォルダを一覧表示
例:ls -l

cd
:ディレクトリを移動
例:cd /home/user

mkdir
:新しいディレクトリを作成
例:mkdir new_folder

rmdir
:空のディレクトリを削除
例:rmdir old_folder

2. ファイル操作
touch
:空のファイルを作成
例:touch sample.txt

cp
:ファイルをコピー
例:cp sample.txt backup.txt

mv
:ファイルを移動または名前変更
例:mv sample.txt new_sample.txt

rm
:ファイルを削除
例:rm backup.txt

3. ファイル閲覧
cat
:ファイルの内容を表示
例:cat sample.txt

less
:ページ単位でファイルを閲覧
例:less sample.txt
※終了するにはqキーをおします。


head
:ファイルの先頭部分を表示
例:head -5 sample.txt

tail
:ファイルの末尾部分を表示
例:tail -5 sample.txt

4. プロセス管理
ps
:実行中のプロセスを表示
例:ps aux

top
:リアルタイムでシステムの状態を監視
例:top
※終了するにはqキーをおします。

kill
:特定のプロセスを終了
例:kill
1191

5. システム情報
uname -a
:システム情報を表示
例:uname -a

df -h
:ディスクの使用状況を表示
例:df -h

free -m
:メモリの使用状況を表示
例:free -m

uptime
:システムの稼働時間を表示
例:uptime

6. ネットワーク関連
ping
:ネットワーク接続の確認
例:ping google.com
※終了する場合、control + qキーを押します。

ifconfig
(またはip a
):ネットワークインターフェースの情報を表示
例:ip a

netstat -tulnp
(またはss -tulnp
):開いているポートの確認
例:ss -tulnp

まとめ
これらのコマンドは、Linuxの基本操作を行う上で欠かせないものばかりです。Linuxを扱う上で、コマンドラインの知識は必須となるため、まずは基本的なコマンドを習得し、実際にターミナルで試しながら理解を深めましょう。
シェルスクリプトの基本
1. シェルスクリプトとは?
シェルスクリプト(Shell Script)とは、複数のコマンドをまとめて実行できるスクリプトのことです。Linux では、Bash(Bourne Again Shell)が最も一般的に使用されます。
シェルスクリプトを活用することで、反復的な作業を自動化し、システム管理やバッチ処理を効率的に行うことができます。
2. シェルスクリプトの作成と実行
2.1 シェルスクリプトの基本構造
シェルスクリプトは .sh
の拡張子をつけたファイルとして作成します。
#!/bin/bash
# これはサンプルのシェルスクリプトです
echo "Hello, Linux!"
#!/bin/bash
は「シバン(shebang)」と呼ばれ、このスクリプトが Bash で実行されることを示します。echo
コマンドは、指定した文字列を出力します。
2.2 スクリプトの実行方法
作成したスクリプトに実行権限を与え、実行します。
chmod +x script.sh
./script.sh
または、bash
を指定して実行することも可能です。
bash script.sh
3. 変数と引数
3.1 変数の宣言と使用
#!/bin/bash
name="Taro"
echo "Hello, $name!"
- 変数
name
に"Taro"
を代入し、$name
で値を参照します。 - 変数を使用する際は
"$変数名"
の形式で記述します。
3.2 コマンドライン引数
スクリプト実行時に引数を渡すことができます。引数とは、スクリプトを実行するときに追加できる値のことで、$1
や $2
などの番号付きの変数を使って受け取ることができます。
#!/bin/bash
echo "引数1: $1"
echo "引数2: $2"
<実行例>
./script.sh Linux Shell
<出力>
引数1: Linux
引数2: Shell
4. 条件分岐とループ
4.1 条件分岐(if 文)
if
文は、指定した条件が真かどうかを判定し、真の場合に特定の処理を実行する構文です。
if 条件式; then
コマンド1
コマンド2
fi
上記のように書き、else
やelif
を使って分岐もできます。
#!/bin/bash
if [ $# -eq 0 ]; then
echo "引数がありません"
else
echo "引数: $1"
fi
<コード説明>
[ $# -eq 0 ]
は、「引数の数が 0 である」という条件を表します。then
以降の処理が条件に応じて実行されます。
4.2 ループ処理(for 文、while 文)
for文
for
文は、指定した範囲やリスト内の要素を順番に処理するループ構文です。繰り返し回数が明確な場合に適しています。
for i in {1..5};
do echo "ループ: $i" done
<コード説明>
{1..5}
は1
から5
までの範囲を指定し、変数i
に1つずつ代入します。do
以降の処理が、範囲の値ごとに実行されます。echo "ループ: $i"
により、i
の値を含むメッセージが出力されます。- ループが
5
回繰り返され、ループ: 1
~ループ: 5
まで順番に出力されます。
while文
while
文は、指定した条件が満たされている間、繰り返し処理を実行するループ構文です。条件が変わるまでループが続くため、繰り返し回数が不明な場合に適しています。
count=1 while [ $count -le 3 ];
do echo "カウント: $count" count=$((count + 1)) done
<コードの説明>
- 変数
count
を1
に初期化します。 while [ $count -le 3 ]
の条件がtrue
の間、ループを実行します。echo "カウント: $count"
でcount
の値を出力します。count=$((count + 1))
により、count
を1
ずつ増加させます。count
が4
になると条件count -le 3
がfalse
となり、ループが終了します。- 実行結果として
カウント: 1
~カウント: 3
が順番に出力されます。
このように、for
文は回数が決まっているループ、while
文は条件が満たされるまでのループ処理に適しています。
5. 関数の定義
関数は、一連のコマンドをまとめて定義し、再利用可能な形にするための仕組みです。関数を使用することで、スクリプトの可読性や保守性を向上させることができます。
greet() {
echo "こんにちは、$1 さん!"
}
greet "太郎"
greet "花子"
<コードの説明>
greet()
という関数を定義。echo "こんにちは、$1 さん!"
により、引数$1
を含むメッセージを出力。$1
は関数に渡された最初の引数を表します。
greet "太郎"
を実行すると、$1
に"太郎"
が渡され、こんにちは、太郎 さん!
と出力されます。greet "花子"
を実行すると、$1
に"花子"
が渡され、こんにちは、花子 さん!
と出力されます。
このように、関数を使うことで、同じ処理を簡潔に記述し、可読性を向上させることができます。
6. シェルスクリプトの実践例
6.1 バックアップスクリプトの例
このシェルスクリプトは、ユーザーの documents
ディレクトリを /backup
にバックアップする処理を行います。ファイルのコピーには rsync
を使用し、効率的なバックアップを実現します。rsync は、ファイルの差分を比較して変更された部分のみを転送する、高速かつ効率的なファイル同期ツールです。
#!/bin/bash
backup_dir="/backup"
mkdir -p $backup_dir
rsync -av --delete /home/user/documents/ $backup_dir/
echo "バックアップ完了"
6.1 バックアップスクリプトの説明
1. シェバン(#!/bin/bash
)
- スクリプトのインタープリタとして
bash
を指定します。
2. バックアップ先ディレクトリの指定
backup_dir="/backup"
変数 backup_dir
にバックアップ先のディレクトリ /backup
を設定します。
3. バックアップディレクトリの作成
mkdir -p $backup_dir
mkdir -p
を使用して、$backup_dir
(/backup
) を作成します。-p
オプションにより、ディレクトリが存在しない場合は作成され、既に存在していてもエラーになりません。
4. ファイルのコピー(バックアップ処理)
rsync -av --delete /home/user/documents/ $backup_dir/
rsync
を使用してdocuments
ディレクトリの内容を/backup
にバックアップします。-a
(アーカイブ)オプションにより、ファイルの所有者・パーミッション・タイムスタンプを保持したままコピーします。-v
(verbose)オプションにより、処理の詳細を表示します。--delete
オプションを付けることで、バックアップ元から削除されたファイルはバックアップ先でも削除され、同期を維持します。documents/
の末尾の/
は、ディレクトリの中身のみをコピーするために必要です。
5. バックアップ完了メッセージの表示
echo "バックアップ完了"
- バックアップ処理が完了したことを示すメッセージ
"バックアップ完了"
を出力します。
6.2 ログ監視スクリプトの例
ログ監視は、システムやアプリケーションの異常を検出し、迅速な対応を行うために重要です。ここでは、特定のログファイルを監視し、エラーが発生した際に通知を行うシェルスクリプトを作成します。
#!/bin/bash
log_file="/var/log/syslog"
error_pattern="ERROR"
log_backup="/var/log/syslog_backup"
# ログのバックアップを作成
cp $log_file $log_backup
# ログの最新行を監視
tail -F $log_file | while read line
do
if echo "$line" | grep -q "$error_pattern"; then
echo "【警告】ログにエラーが検出されました: $line"
fi
done
6.2 ログ監視スクリプトの説明
1.シェバン(#!/bin/bash
)
- スクリプトのインタープリタとして
bash
を指定します。
2.変数の定義
log_file="/var/log/syslog"
error_pattern="ERROR"
log_backup="/var/log/syslog_backup"
log_file
:監視するログファイル(例:/var/log/syslog
)。error_pattern
:検出するエラーパターン(例:ERROR
という文字列を含む行を検出)。log_backup
:ログのバックアップを保存するファイル。
3.ログのバックアップを作成
cp $log_file $log_backup
cp
コマンドを使用して、現在のログファイルをバックアップとして保存します。
4.tail -F
を使用してリアルタイム監視
tail -F $log_file | while read line
tail -F
コマンドは、ログファイルの末尾を監視し、新しい行が追加されるたびにリアルタイムで取得します。| while read line
により、新しく追加された行をline
変数に格納し、ループ処理を行います。
5. エラーパターンの検出
do
if echo "$line" | grep -q "$error_pattern"; then
echo "【警告】ログにエラーが検出されました: $line"
fi
done
do
は、while
やfor
ループなどの繰り返し処理の中で実行されるコードブロックの開始を示します。if ... then
は条件分岐を行い、$line
内に$error_pattern
が含まれていれば、then
以下の処理を実行します。grep -q "$error_pattern"
を使用し、取得した行にERROR
の文字列が含まれるかをチェックします。- 該当する行が見つかった場合、
echo
コマンドで警告メッセージを出力します。 do
に対応するwhile
やfor
の処理が完了すると、done
でループが終了します。
7. まとめ
シェルスクリプトを活用することで、システム管理や定型作業を自動化できます。基本のコマンドや制御構造を理解し、効率的なスクリプト作成を目指しましょう。
シェルスクリプトの応用
基本的なシェルスクリプトを理解したら、より高度なスクリプトを作成することで、効率的なシステム管理や自動化が可能になります。本記事では、シェルスクリプトの応用として、環境変数の活用、エラーハンドリング、並列処理、外部コマンドの活用などについて解説します。
1. 環境変数と設定ファイルの活用
1.1 環境変数の利用
環境変数はシェルスクリプト内で外部の設定情報を参照する際に利用されます。下記シェルスクリプトは、実行したユーザーの基本的な情報を表示するものです。
#!/bin/bash
echo "ユーザー名: $USER"
echo "ホームディレクトリ: $HOME"
echo "現在のディレクトリ: $PWD"
コードの説明
#!/bin/bash
- スクリプトがBashシェルで実行されることを指定します。
echo "ユーザー名: $USER"
- 環境変数
$USER
を使って、現在のユーザー名を表示します。
echo "ホームディレクトリ: $HOME"
$HOME
を使い、そのユーザーのホームディレクトリのパスを表示します。
echo "現在のディレクトリ: $PWD"
$PWD
を使って、スクリプトを実行した際の作業ディレクトリ(カレントディレクトリ)を表示します。
実行結果の例
上記コマンドを実行した際の実行結果の例は以下になります。
ユーザー名: hajime
ホームディレクトリ: /home/hajime
現在のディレクトリ: /home/hajime/ドキュメント
1.2 設定ファイルの読み込み
設定ファイルを利用することで、スクリプトの柔軟性を高められます。下記シェルスクリプトは、設定ファイル /etc/myconfig.conf
から変数を読み込み、その値を表示するものです。
#!/bin/bash
source /etc/myconfig.conf
echo "設定された値: $CONFIG_VALUE"
コードの説明
#!/bin/bash
- スクリプトが Bash シェルで実行されることを指定します。
source /etc/myconfig.conf
source
コマンド(または.
コマンド)を使って/etc/myconfig.conf
の内容を現在のスクリプトに読み込みます。- これにより、設定ファイル内で定義された変数がスクリプト内で使用できるようになります。
echo "設定された値: $CONFIG_VALUE"
- 変数
$CONFIG_VALUE
に設定ファイル内の値が格納されていると仮定し、それを画面に表示します。
実行結果の例
上記コマンドを実行した際の結果は、/etc/myconfig.conf
の内容によって異なります。
例えば、/etc/myconfig.conf
に以下のような設定がある場合は、
CONFIG_VALUE="example_value"
スクリプトの出力は次のようになります。
設定された値: example_value
※CONFIG_VALUE
が /etc/myconfig.conf
に定義されていない場合、出力は 設定された値:
(空白)となる可能性があります。
2. エラーハンドリングとデバッグ
2.1 エラー処理(trapコマンド)
エラー発生時に特定の処理を実行するには trap
を使用します。
#!/bin/bash
trap 'echo "エラーが発生しました"; exit 1' ERR
ls /nonexistent_directory
コードの説明
#!/bin/bash
- スクリプトが Bash シェルで実行されることを指定します。
trap 'echo "エラーが発生しました"; exit 1' ERR
trap
コマンドを使用し、ERR
シグナル(エラー発生時)をキャッチします。ERR
が発生した場合、echo "エラーが発生しました"
というメッセージを出力し、exit 1
でスクリプトを終了します。
ls /nonexistent_directory
- 存在しないディレクトリ
/nonexistent_directory
の内容をls
コマンドで表示しようとします。 - このディレクトリは存在しないため、
ls
コマンドはエラーを出します。 trap
によってERR
がキャッチされ、エラーメッセージが表示されてスクリプトが終了します。
実行結果の例
上記コマンドを実行した際の実行結果の例は以下になります。
ls: cannot access '/nonexistent_directory': No such file or directory
エラーが発生しました
このスクリプトは、エラー発生時に適切なメッセージを表示し、スクリプトの異常終了を明示的に行うように設計されています。
2.2 デバッグモード(setコマンド)
スクリプトの実行過程を詳細に確認するには set -x
を使用します。
#!/bin/bash
set -x
echo "デバッグモードで実行"
set +x
echo "デバッグ終了"
コードの説明
#!/bin/bash
- スクリプトが Bash シェルで実行されることを指定します。
set -x
- デバッグモードの有効化 (
-x
) set -x
を実行すると、以降のコマンドが 実行前に展開された形で表示 されます。- スクリプトの動作を詳細に確認する際に役立ちます。
echo "デバッグモードで実行"
echo
コマンドで"デバッグモードで実行"
というメッセージを出力します。set -x
により、実際にecho
コマンドがどのように展開されるかが表示されます。
set +x
- デバッグモードの無効化 (
+x
) - これ以降のコマンドはデバッグ出力されなくなります。
echo "デバッグ終了"
"デバッグ終了"
というメッセージを出力します。set +x
により、この行はデバッグモードの出力対象になりません。
実行結果の例
スクリプトを実行すると、以下のような出力になります。
+ echo 'デバッグモードで実行'
デバッグモードで実行
+ set +x
デバッグ終了
+ echo 'デバッグモードで実行'
→echo
コマンドが実行される前に展開された形で表示されます。set +x
の後は通常の出力 (デバッグ終了
) のみが表示され、デバッグ情報は出力されません。
3. 並列処理とバックグラウンド実行
3.1 & を使用した並列実行
以下の例では、複数のコマンドを並行して実行します。下記シェルスクリプトは、バックグラウンドで並行して実行される処理を wait
コマンドで待機し、すべての処理が完了した後にメッセージを表示するものです。
#!/bin/bash
echo "タスク1実行中..." &
echo "タスク2実行中..." &
wait
echo "すべてのタスクが完了しました"
コードの説明
!/bin/bash
- スクリプトが Bash シェルで実行されることを指定します。
echo "タスク1実行中..." &
echo
コマンドで「タスク1実行中…」と表示します。&
を付けることで、このコマンドをバックグラウンドジョブとして実行し、次の処理を待たずに進みます。
echo "タスク2実行中..." &
- 「タスク2実行中…」を表示し、同様にバックグラウンドジョブとして実行します。
wait
- すべてのバックグラウンドジョブが終了するまでスクリプトの実行を待機します。
echo "すべてのタスクが完了しました"
wait
によりバックグラウンドジョブの終了を確認した後、「すべてのタスクが完了しました」と表示します。
実行結果の例
このシェルスクリプトを実行すると、バックグラウンドで実行される echo
コマンドの順番が環境によって異なる場合がありますが、一般的な実行結果の例は以下のようになります。
タスク1実行中...
タスク2実行中...
すべてのタスクが完了しました
※タスク1実行中...
と タスク2実行中...
の順番は前後する可能性がありますが、wait
によりバックグラウンドジョブの完了を待つため、最後に "すべてのタスクが完了しました"
が必ず表示されます。
3.2 xargs による並列処理
ファイルリストを並列で処理する例です。下記シェルスクリプトは、カレントディレクトリ内のすべての .txt
ファイルを並列で圧縮する処理を行います。
ls *.txt | xargs -n 1 -P 4 gzip
コードの説明
ls *.txt
- カレントディレクトリ内の
.txt
ファイルの一覧を取得します。
| xargs -n 1 -P 4 gzip
xargs
コマンドを使用し、取得したファイル名をgzip
コマンドに渡して圧縮します。-n 1
は、gzip
に対して 1 つのファイルずつ渡すオプションです。-P 4
は、最大 4 つのプロセスを並行して実行するオプションで、4 つのファイルを同時に圧縮できます。
実行結果の例
このシェルスクリプトを実行すると、カレントディレクトリ内の .txt
ファイルを gzip
で圧縮します。
例えば、実行前に以下の .txt
ファイルが存在するとします。
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
このコマンドを実行すると、xargs -P 4
により最大 4 つの gzip
プロセスが並列で実行され、.txt
ファイルが .gz
に圧縮されます。
<実行結果の例(並列処理のため順番は異なる可能性あり)>
file1.txt を圧縮中...
file2.txt を圧縮中...
file3.txt を圧縮中...
file4.txt を圧縮中...
file5.txt を圧縮中...
圧縮後、ディレクトリの内容は以下のようになります。
file1.txt.gz
file2.txt.gz
file3.txt.gz
file4.txt.gz
file5.txt.gz
※実際の出力には gzip
の詳細なメッセージは表示されませんが、並列処理の影響でファイルの圧縮順序は異なる可能性があります。
4. 外部コマンドとAPI連携
4.1 curl を用いたAPIリクエスト
Web API と連携し、データを取得できます。下記シェルスクリプトは、curl
コマンドを使用して外部APIからデータを取得し、そのレスポンスを表示するものです。
#!/bin/bash
response=$(curl -s https://api.example.com/data)
echo "APIレスポンス: $response"
コードの説明
#!/bin/bash
- スクリプトが Bash シェルで実行されることを指定します。
response=$(curl -s https://api.example.com/data)
curl
コマンドを使用してhttps://api.example.com/data
からデータを取得します。-s
(--silent
)オプションは、進捗情報やエラーメッセージを非表示にし、レスポンスデータのみを取得するためのものです。$(...)
により、curl
の出力をresponse
変数に格納します。
echo "APIレスポンス: $response"
- 取得したデータを
response
変数から出力します。
実行結果の例
このシェルスクリプトを実行すると、curl
コマンドを使用して https://api.example.com/data
からデータを取得し、変数 response
に格納した後、その内容を echo
で表示します。
<実行結果の例>
APIレスポンス: {"status":"success","data":{"id":123,"name":"example"}}
また、API がエラーを返した場合は、次のような出力になる可能性があります。
APIレスポンス: {"error":"Not Found"}
※実際の出力は https://api.example.com/data
のレスポンスによって異なります。
※-s
オプションにより、curl
の進行状況メッセージは表示されません。
4.2 jq によるJSON処理
APIレスポンスのJSONデータを解析するには jq
を利用します。下記シェルスクリプトは、jq
コマンドを使用してJSONデータを解析し、特定の値を抽出する処理を行います。
#!/bin/bash
json='{"name": "Linux", "version": "5.10"}'
echo $json | jq '.name'
コードの説明
#!/bin/bash
- スクリプトが Bash シェルで実行されることを指定します。
json='{"name": "Linux", "version": "5.10"}'
- 変数
json
に、name
とversion
を含むJSONデータを格納します。
echo $json | jq '.name'
echo $json
でJSONデータを標準出力に送信します。| jq '.name'
により、JSONからname
の値(”Linux”)を抽出し、出力します。
実行結果の例
このシェルスクリプトを実行すると、jq
コマンドを使用して JSON データから "name"
の値を抽出します。
<実行結果の例>
"Linux"
※ jq
の出力では、JSON 形式を保持するために値が "(ダブルクォート)
で囲まれます。
※ jq
コマンドがインストールされていない場合は、エラーが発生する可能性があります(例: command not found: jq
)。
5. 高度なファイル処理
5.1 監視スクリプト
特定のディレクトリ内の変更を監視し、ログに記録します。下記このシェルスクリプトは、inotifywait
コマンドを使用して /var/log
ディレクトリ内のファイル変更を監視し、変更があった場合にログを /var/log/monitor.log
に記録する処理を行います。
#!/bin/bash
inotifywait -m /var/log -e modify -e create -e delete --format '%w%f %e' |
while read file event; do
echo "$file に $event が発生しました" >> /var/log/monitor.log
done
コードの説明
#!/bin/bash
- スクリプトが Bash シェルで実行されることを指定します。
inotifywait -m /var/log -e modify -e create -e delete --format '%w%f %e' |
inotifywait
を使用して/var/log
ディレクトリの変更を監視します。inotifywait コマンドは、Linux の inotify 機能を利用してファイルやディレクトリの変更を監視し、指定したイベント(作成、変更、削除など)が発生した際にリアルタイムで通知を行うツールです。-m
(monitor) オプションを指定することで、継続的に監視を行います。-e modify -e create -e delete
で、ファイルの変更 (modify
)、作成 (create
)、削除 (delete
) を監視対象にします。--format '%w%f %e'
で、イベントが発生したファイル (%w%f
) とイベントの種類 (%e
) を取得します。|
(パイプ) を使用して、出力をwhile read
ループへ渡します。
while read file event; do
inotifywait
の出力(ファイル名とイベント名)をfile
とevent
という変数に格納し、ループ処理を行います。
echo "$file に $event が発生しました" >> /var/log/monitor.log
- 監視したイベントの情報を
/var/log/monitor.log
に記録します。 - 出力例:
/var/log/syslog に MODIFY が発生しました
done
while
ループの終了を示します。
実行結果の例
このシェルスクリプトを実行すると、/var/log
ディレクトリ内のファイルに対して、以下のイベントを監視し、変更があった場合に /var/log/monitor.log
に記録します。
【監視するイベント】
modify
(ファイルの変更)create
(ファイルの作成)delete
(ファイルの削除)
<実行結果の例 (/var/log/monitor.log
の内容)>
例えば、次のような操作が行われた場合は以下になります。
/var/log/example.log
が作成される/var/log/example.log
が変更される/var/log/example.log
が削除される
/var/log/monitor.log
に記録される内容は次のようになります。
/var/log/example.log CREATE に発生しました
/var/log/example.log MODIFY に発生しました
/var/log/example.log DELETE に発生しました
【注意点】
inotifywait
がインストールされていない環境ではエラーになります (command not found: inotifywait
)。inotifywait
の-m
オプション(monitor モード)により、スクリプトは継続的に監視を続けます。/var/log/monitor.log
に書き込みを行うため、スクリプトの実行には適切な権限が必要です(例:sudo
が必要な場合がある)。
5.2 大量のファイルを一括処理
ファイルを一定数ごとに処理する例です。下記シェルスクリプトは、find
コマンドと xargs
を組み合わせて、指定ディレクトリ内のファイルを /backup/
ディレクトリへ並列コピーする処理を行います。
#!/bin/bash
find /path/to/files -type f | xargs -n 10 -P 4 cp -t /backup/
コードの説明
#!/bin/bash
- スクリプトが Bash シェルで実行されることを指定します。
json='{"name": "Linux", "version": "5.10"}'
- 変数
json
に、name
とversion
を含むJSONデータを格納します。
echo $json | jq '.name'
echo $json
でJSONデータを標準出力に送信します。| jq '.name'
により、JSONからname
の値(”Linux”)を抽出し、出力します。
実行結果の例
このシェルスクリプトを実行すると、/path/to/files
内のすべてのファイルを /backup/
にコピーします。
<実行の流れ>
find /path/to/files -type f
で/path/to/files
内のファイル一覧を取得xargs -n 10 -P 4 cp -t /backup/
で、最大 10 ファイルずつ 4 並列プロセスでコピー
<実行結果の例>
・前提となるディレクトリ構造
/path/to/files/
├── file1.txt
├── file2.txt
├── file3.txt
├── file4.txt
├── file5.txt
├── file6.txt
├── file7.txt
├── file8.txt
├── file9.txt
├── file10.txt
├── file11.txt
└── file12.txt
・コピー実行後の /backup/
の内容
/backup/
├── file1.txt
├── file2.txt
├── file3.txt
├── file4.txt
├── file5.txt
├── file6.txt
├── file7.txt
├── file8.txt
├── file9.txt
├── file10.txt
├── file11.txt
└── file12.txt
<出力(標準出力には特に何も表示されないが、-v
を付けると詳細が見える)>
通常は出力なし。
<cp -v
を使った場合>
'/path/to/files/file1.txt' -> '/backup/file1.txt'
'/path/to/files/file2.txt' -> '/backup/file2.txt'
...
'/path/to/files/file12.txt' -> '/backup/file12.txt'
【ポイント】
-P 4
により 4 並列で処理されるため、大量のファイルを高速にコピー可能。-n 10
により、10 ファイルずつcp
に渡される。/backup/
フォルダが存在しない場合、エラーになるため事前に作成しておく必要がある。xargs
の並列処理のため、ファイルのコピー順は一定ではない。
7. シェルスクリプトの応用のまとめ
本記事では、シェルスクリプトの応用として、環境変数の利用、エラーハンドリング、並列処理、外部コマンドの活用などを紹介しました。これらの技術を活用することで、より高度なスクリプトを作成し、システム管理の効率化を図ることができます。
まとめ
今回は、下記3点について説明しました。
- Linuxの基本コマンド
- シェルスクリプトの基本
- シェルスクリプトの応用
今回は、Linuxの基本コマンドとシェルスクリプトについて説明しました。GUI環境のLinuxではコマンドを使わずに操作できますが、ビジネスで利用されるLinuxの多くはCUI環境です。本記事を参考に基本コマンドを習得し、効率的な操作を身につけましょう。また、シェルスクリプトを活用すれば、タスクの自動化が可能です。日々のバックアップや監視業務の負担を軽減するためにも、シェルスクリプトの活用をぜひ学んでください。
これからも、Macのシステムエンジニアとして、日々、習得した知識や経験を発信していきますので、是非、ブックマーク登録してくれると嬉しいです!
それでは、次回のブログで!