Bash 入門

Bash ファイルとディレクトリの操作

サーバー構成を管理するシステム管理者、タスクを自動化するスクリプトを書く開発者、あるいは大規模なデータセットを扱うデータサイエンティストであっても、コマンドラインでファイルやディレクトリを移動、作成、変更、削除する能力は不可欠です。

本章では、Bashでこれらのタスクを実行するための包括的なガイドを提供し、より高度なスクリプト作成やオートメーション(自動化)のための堅牢な基礎を築きます。

1. ファイルシステム階層構造の理解

Linuxやその他のUnix系オペレーティングシステムにおけるファイルシステムは、階層的なツリー構造で構成されています。この構造のベースはルートディレクトリ(Root Directory)と呼ばれ、/ で表されます。他のすべてのファイルやディレクトリはこのルートディレクトリの下に整理されています。この階層構造を理解することは、ファイルシステム内を効率的に移動するために不可欠です。

  • ルートディレクトリ (/): 最高レベルのディレクトリ。他のすべてのコンテンツはルートディレクトリのサブディレクトリです。
  • ホームディレクトリ (/home/username): 各ユーザーには、個人ファイルを保存するための専用ディレクトリがあります。ショートカット記号 ~ は現在のユーザーのホームディレクトリを表します。

1.1 一般的なシステムディレクトリ:

  • /bin: 基本的なユーザーコマンドのバイナリファイル(実行プログラム)が含まれます。
  • /boot: システムの起動に必要なコアファイルが含まれます。
  • /dev: デバイスファイル(ハードウェアのマッピング)が含まれます。
  • /etc: システム全体の設定ファイル(コンフィグファイル)が含まれます。
  • /lib: プログラムに必要な共有ライブラリのコードが含まれます。
  • /media: USBメモリなどのリムーバブルメディアのマウントポイントです。
  • /mnt: 一時的なファイルシステムのマウントポイントです。
  • /opt: オプションのアプリケーションソフトウェアパッケージのインストール場所です。
  • /proc: プロセスやシステム情報を含む仮想ディレクトリです。
  • /root: システムのスーパーユーザー(rootユーザー)のホームディレクトリです。
  • /sbin: システム管理者が使用するシステム管理用バイナリコマンドです。
  • /tmp: 一時ファイル(テンポラリファイル)の保存場所。通常、システム再起動時にクリアされます。
  • /usr: ユーザー関連のプログラム、ライブラリ、ドキュメントなど。
  • /var: 可変データの保存場所(ログファイル、データベースなど)。

1.2 階層構造の例:

Apache Webサーバーの設定ファイルは /etc/apache2/apache2.conf にあるかもしれません。
ユーザー名「john」の個人ドキュメントは /home/john/Documents に保存されているでしょう。

想定されるシナリオ: あなたがWebアプリケーションを開発していると想像してください。そのアプリケーションの設定ファイルは /opt/myapp/config にあり、Webサーバーのドキュメントルートは /var/www/myapp 、そしてログファイルは /var/log/myapp に書き込まれるかもしれません。このような階層基準を理解しておくことで、アプリケーションのファイルを効率的に整理・管理できます。

2. ファイルとディレクトリの作成

Bashには、新しいファイルやディレクトリを作成するための専用コマンドが用意されています。

  • touch: 空のファイルを作成します。ファイルが既に存在する場合、そのファイルのタイムスタンプ(最終更新日時)を更新します。
  • mkdir: (Make Directory) 新しいディレクトリを作成します。

2.1 コマンドの例:

newfile.txt という名前の空ファイルを作成する:

touch newfile.txt

newdir という名前のディレクトリを作成する:

mkdir newdir

newdir の内部に anotherdir というディレクトリを作成する(-p オプションを使用すると、親ディレクトリが存在しない場合に自動的に作成されます):

mkdir -p newdir/anotherdir

注:-p オプションを付けない場合、newdir が存在しないとこのコマンドはエラーになります。

一度に複数の並列ディレクトリを作成する:

mkdir dir1 dir2 dir3

       想定されるシナリオ: プロジェクトのディレクトリ構造をセットアップする場合を考えてみましょう。 mkdir -p project/src/main/java を使えば、一気に完全なディレクトリツリーを作成できます。その後、 touch project/README.md を使って、そのプロジェクトの基本的なリードミーファイルを作成できます。

3. ファイルとディレクトリの削除

Bashは同様に、ファイルやディレクトリを削除するためのコマンドも提供しています。

  • rm: (Remove) ファイルを削除します。
  • rmdir: (Remove Directory) 空のディレクトリを削除します。
  • rm -r: ディレクトリとその中身すべてを再帰的に削除します。非常に強力なコマンドであるため、慎重に使用する必要があります。

3.1 コマンドの例:

oldfile.txt という名前のファイルを削除する:

rm oldfile.txt

emptydir という名前の空のディレクトリを削除する:

rmdir emptydir

fulldir という名前のディレクトリとその中に含まれるすべてのコンテンツを削除する:

rm -r fulldir

警告: このコマンドは、ディレクトリとそのすべての内容を永久に削除します。コマンドラインには「ゴミ箱」や「元に戻す(Undo)」の選択肢はありません。削除を実行する前に ls -R fulldir で削除される内容を確認する習慣をつけると良いでしょう。

ワイルドカード*)を使用して複数のファイルを削除する:

rm *.txt

このコマンドは、カレントディレクトリ内の .txt で終わるすべてのファイルを削除します。ワイルドカードを使用する際は細心の注意を払ってください!

インタラクティブな削除(安全性を高める):

rm -i important_file

-i フラグを付けると、各ファイルを削除する前に確認のプロンプトが表示されます(y または n を入力します)。

       想定されるシナリオ: 不要になったログファイルが含まれている一時ディレクトリがあるとします。 rm -r /tmp/old_logs を使用して、ディレクトリ全体とその内容を削除できます。ただし、Enterキーを押す前に、必ずパスが正しいか再三確認してください。

4. ファイルとディレクトリのコピーと移動

ファイルを管理する際、コピーや移動が必要になることがよくあります。

  • cp: (Copy) ファイルやディレクトリをコピーします。
  • mv: (Move) ファイルやディレクトリを移動します。また、ファイル名の変更(リネーム)にもよく使われます。

4.1 コマンドの例:

myfile.txt という名前のファイルをコピーし、 myfile_copy.txt という名前にする:

cp myfile.txt myfile_copy.txt

myfile.txt ファイルを backup という名前のディレクトリにコピーする:

cp myfile.txt backup/

mydir という名前のディレクトリとその内容すべてを mydir_copy という名前で再帰的にコピーする(ディレクトリを扱う場合は -r オプションを使用します):

cp -r mydir mydir_copy

oldfile.txt という名前のファイルを newfile.txt という名前に移動(実質的にはリネーム)する:

mv oldfile.txt newfile.txt

myfile.txt ファイルを destination という名前のディレクトリに移動する:

mv myfile.txt destination/

olddir というディレクトリを移動し、 newdir という名前に変更する:

mv olddir newdir

       想定されるシナリオ: プロジェクト構造を再編し、いくつかのファイルをあるディレクトリから別のディレクトリへ移動させる必要があるとします。 mv file1.txt file2.txt file3.txt destination_directory/ を使えば、これら3つのファイルを一度に移動できます。

5. ファイル権限の概要

ファイル権限(パーミッション)は、誰が特定のファイルやディレクトリを「読み取り(read)」、「書き込み(write)」、「実行(execute)」できるかを制御します。Bashでは、 ls -l コマンドで権限を確認し、 chmod コマンドで権限を変更できます。ただし、ファイル権限に関する詳細な議論は本章の範囲を超えるため、後のモジュールで専用の解説を行います。