本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。
第22回 よく使うコマンドを組み合わせよう:mkdir・cp・mvで作る実用スクリプト | はじめてのシェルスクリプト

はじめてのシェルスクリプト | 第22回
はじめに
この連載では、macOS のターミナルで sh を使いながら、シェルスクリプトの基本を順番に学んでいきます。
ここまでの回で、変数・条件分岐・ループ・関数・リダイレクト・コマンド置換など、シェルスクリプトの基本要素をひとつひとつ学んできました。それぞれの仕組みは理解できていても、「実際にどう組み合わせて使うのか」をイメージしにくいことがあるかもしれません。
第22回では、mkdir cp mv といった日常的によく使うコマンドを組み合わせた、小さな実用スクリプトを作ります。「ディレクトリを作ってからファイルをコピーする」「移動先が存在するかを確認してから移動する」といった、実際の作業で役立つ流れを体験しましょう。
「学んだ知識を実際の作業に使える」という感覚を、ぜひここで体験してみてください。
この回で学ぶこと
- 複数のコマンドを順番に使う考え方
mkdircpmvの基本- 作業用ディレクトリを作って処理する流れ
- 存在確認しながら安全に進める形
- 初学者でも追いやすい実用例
rmを使うときの注意- コマンドを並べて自動化する意味
コマンドを組み合わせるとは何か
ひとつずつの操作を順番に実行する
シェルスクリプトでは、複数のコマンドを順番に書くことで、一連の作業を自動化できます。
たとえば、「ディレクトリを作る」「ファイルをコピーする」「名前を変えて移動する」といった流れを、ひとつのスクリプトにまとめられます。
今回の例でやること
今回は、元になるファイルを作業用ディレクトリへコピーし、別名で移動する例を作ります。
削除を行う rm もよく使いますが、誤って重要なファイルを消す危険があるため、今回は注意点の説明だけに留めます。
サンプルコード
practical_sample.sh に次の内容を保存します。
#!/bin/sh
source_file="memo.txt"
work_dir="work"
backup_dir="backup"
if [ ! -f "$source_file" ]; then
echo "元ファイルが見つかりません: $source_file"
exit 1
fi
mkdir -p "$work_dir"
mkdir -p "$backup_dir"
cp "$source_file" "$work_dir/"
mv "$work_dir/$source_file" "$backup_dir/memo_backup.txt"
echo "処理が終わりました"
echo "コピー先: $backup_dir/memo_backup.txt"
実行手順
1. 元ファイルを作成する
まず、同じディレクトリに memo.txt を作成します。
内容は簡単な文字列でかまいません。
sample memo
2. スクリプトを作成して保存する
エディタで practical_sample.sh という名前のファイルを作成し、次の内容を保存します。
#!/bin/sh
source_file="memo.txt"
work_dir="work"
backup_dir="backup"
if [ ! -f "$source_file" ]; then
echo "元ファイルが見つかりません: $source_file"
exit 1
fi
mkdir -p "$work_dir"
mkdir -p "$backup_dir"
cp "$source_file" "$work_dir/"
mv "$work_dir/$source_file" "$backup_dir/memo_backup.txt"
echo "処理が終わりました"
echo "コピー先: $backup_dir/memo_backup.txt"
3. スクリプトを実行する
次のコマンドを実行します。
sh practical_sample.sh
実行結果の例です。
処理が終わりました
コピー先: backup/memo_backup.txt
実行後は backup/memo_backup.txt が作成されます。
コードの読み方
mkdir -p “$work_dir”
作業用ディレクトリを作成しています。
-p を付けると、すでに存在する場合でもエラーになりにくくなります。
cp “$source_file” “$work_dir/”
memo.txt を work ディレクトリへコピーしています。
元のファイルはそのまま残ります。
mv “$work_dir/$source_file” “$backup_dir/memo_backup.txt”
work の中にあるファイルを backup ディレクトリへ移動しながら、名前を memo_backup.txt に変更しています。
mv は移動と名前変更の両方に使えます。
if [ ! -f “$source_file” ]; then
元ファイルが存在するかを確認しています。
存在しないまま cp を実行すると失敗するため、先に確認しておく形にしています。
コマンドを並べて自動化する意味
これらの処理を毎回手で実行しても動作しますが、同じ流れを何度も使うならスクリプトにまとめた方が整理しやすくなります。
実行順を固定できるため、作業の抜けや入力ミスも減らしやすくなります。
rm を使うときの注意
rm はファイルを削除するコマンドです。
便利ですが、削除した内容は簡単には戻せません。
初学者のうちは、削除処理をスクリプトへ入れる前に、本当に必要かを確認してください。
特にワイルドカードを使った削除は、想定より広い範囲に影響することがあります。
初学者がつまずきやすい点
パスの指定を間違える
"$work_dir/$source_file" のように、ディレクトリ名とファイル名をつないで使う場面では、どこにファイルがあるかを整理して確認してください。
cp と mv の役割を混同する
cp はコピーです。
mv は移動または名前変更です。
この違いを意識しないと、元のファイルが残るかどうかを誤解しやすくなります。
確認なしで実行する
元ファイルの存在確認や、作業先ディレクトリの確認を省くと、失敗した理由が分かりにくくなります。
よくあるエラー
No such file or directory
元ファイルや移動先ディレクトリのパスが正しいか確認してください。
特に memo.txt を作成していない場合は cp が失敗します。
ファイルが見つからない
スクリプトを実行している場所と、memo.txt を保存した場所が一致しているか確認してください。
想定と違う場所にファイルができる
相対パスで書いているため、どのディレクトリで実行したかが重要です。
まず pwd で現在地を確認してから実行すると分かりやすいです。
練習用コード
次の内容で copy_report.sh を作成して実行してみてください。
#!/bin/sh
source_file="report.txt"
target_dir="reports"
if [ ! -f "$source_file" ]; then
echo "report.txt が見つかりません"
exit 1
fi
mkdir -p "$target_dir"
cp "$source_file" "$target_dir/"
echo "コピーが終わりました"
report.txt を用意してから実行し、reports ディレクトリにコピーされることを確認してください。
この回で理解しておくこと
- 複数のコマンドを順番に並べると作業を自動化できる
mkdirはディレクトリ作成、cpはコピー、mvは移動や名前変更に使う- 先に存在確認を入れると失敗しにくい
- 相対パスで書くときは現在の作業場所が重要である
rmは便利だが慎重に使う必要がある- 小さな実用例でもスクリプト化する価値がある
まとめ
今回は、mkdir cp mv を組み合わせて、ファイルを整理する小さな実用スクリプトを確認しました。
基本コマンドを順番に使えるようになると、日常的な作業を少しずつ自動化できるようになります。
次回は、テキストファイルを読みながら処理する方法を学びます。
次回予告
次回は「テキストファイルを読みながら処理しよう」です。
while read を使って1行ずつ処理する基本を確認します。









