Red Hat Enterprise Linux でファイルを管理する

Red Hat Enterprise LinuxBeginner
オンラインで実践に進む

はじめに

この実験 (Lab) では、RHEL 環境で基本的なコマンドラインツールを使用してファイルとディレクトリを管理する実践的な経験を積みます。pwdls で現在の場所を探索し、内容を一覧表示する方法、cdtouch でディレクトリを移動しファイルを作成する方法、そして mkdircpmvrm でファイルとディレクトリを効果的に整理する方法を学びます。

さらに、ln(ハードリンクとシンボリックリンクの両方)を使用してファイル間のリンクを作成する方法や、シェル展開 (shell expansions) を使用してファイルを効率的に選択する方法を発見し、コマンドラインでのファイル管理に必要な基本的なスキルを習得します。

pwd と ls で現在の場所を探索し、内容を一覧表示する

このステップでは、ファイルシステム内の現在の場所を探索し、pwd および ls コマンドを使用してその内容を一覧表示する方法を学びます。現在の作業ディレクトリを理解し、その内容を表示できることは、コマンドラインからファイルを参照および管理するための基本的なスキルです。

まず、pwd コマンドを使用して現在の作業ディレクトリを特定しましょう。pwd は "print working directory" の略で、ファイルシステム内の現在の場所のフルパス名を表示します。

pwd

以下のような出力が表示され、現在のディレクトリを示します。

/home/labex

次に、ls コマンドを使用して現在のディレクトリの内容を一覧表示します。ls は "list" の略で、指定されたディレクトリの内容、またはディレクトリが指定されていない場合は現在の作業ディレクトリの内容を一覧表示します。

ls

ホームディレクトリの内容が表示されるはずです。

project

ls コマンドには、ファイルやディレクトリに関する追加情報を表示するためのいくつかの便利なオプションがあります。

  1. -l オプション(ロングリスト形式)は、パーミッション、ハードリンク数、所有者、グループ、サイズ、最終更新時刻など、各ファイルとディレクトリに関する詳細情報を提供します。

    ls -l
    

    以下のような出力が表示されるはずです。

    total 0
    drwxr-xr-x 2 labex labex 6 Aug 27  2024 project
    
  2. -a オプション(すべてのファイル)は、隠しファイルを含むすべてのファイルを一覧表示します。Linux では、ドット (.) で始まるファイル名は隠しファイルと見なされます。また、. は現在のディレクトリを指し、.. は親ディレクトリを指します。

    ls -a
    

    隠し設定ファイルを含む、以下のような出力が表示されるはずです。

    .  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .tmux.conf  project
    
  3. -l-a を組み合わせて -la とすると、隠しファイルを含むすべてのファイルのロングリストが表示されます。

    ls -la
    

    これにより、隠しファイルを含むすべてのファイルとディレクトリの詳細情報が表示されます。

    total 20
    drwx------ 1 labex labex  72 Jun  4 03:12 .
    drwxr-xr-x 1 root  root   19 Aug 27  2024 ..
    -rw------- 1 labex labex  31 Jun  4 03:13 .bash_history
    -rw-r--r-- 1 labex labex  18 Feb 15  2024 .bash_logout
    -rw-r--r-- 1 labex labex 141 Feb 15  2024 .bash_profile
    -rw-r--r-- 1 labex labex 877 Jun  4 03:12 .bashrc
    -rw-r--r-- 1 labex labex  68 Aug 27  2024 .tmux.conf
    drwxr-xr-x 2 labex labex   6 Aug 27  2024 project
    
  4. -R オプション(再帰的)は、すべてのサブディレクトリの内容を再帰的に一覧表示します。これを実演するために、まずサブディレクトリを作成しましょう。

    mkdir mydir
    

    次に、ls -R を使用して再帰的な一覧表示を確認します。

    ls -R
    

    mydirproject の両方のディレクトリが表示され、その後に内容が表示されるはずです。

    .:
    mydir  project
    
    ./mydir:
    
    ./project:
    

    最後に、次のステップのために環境をクリーンアップするために mydir ディレクトリを削除しましょう。

    rmdir mydir
    

    このコマンドは空のディレクトリに対してのみ機能します。rmdir および rm については、後のステップで詳しく説明します。

Command line ls output example

cd と touch でディレクトリを移動し、ファイルを作成する

このステップでは、cd コマンドを使用して現在の作業ディレクトリを変更する方法と、touch コマンドを使用して空のファイルを作成する方法を学びます。これらのコマンドは、ファイルを整理し、ファイルシステム内を効率的に移動するために不可欠です。

まず、現在の場所を確認し、ステップ 1 で表示された project ディレクトリに移動しましょう。

pwd

出力は /home/labex(あなたのホームディレクトリ)となるはずです。

次に、cd コマンドを使用して project ディレクトリに移動します。

cd project

新しい場所を確認します。

pwd

出力は /home/labex/project となるはずです。

ここで、現在の project ディレクトリ内に documents という名前の新しいディレクトリを作成します。これには、前のステップで少し触れた mkdir コマンドを使用します。

mkdir documents

documents ディレクトリが作成されたことを確認します。

ls

出力に documents が表示されるはずです。

次に、cd コマンドを使用して、シェルの現在の作業ディレクトリを新しく作成した documents ディレクトリに変更します。

cd documents

ディレクトリを変更した後、pwd を使用して新しい場所を確認するのが良い習慣です。

pwd

出力は /home/labex/project/documents となるはずです。

cd コマンドには、移動に便利なオプションがいくつかあります。

  1. cd -: このコマンドは、以前いたディレクトリに移動します。試してみましょう。

    cd -
    

    /home/labex/project に戻るはずです。pwd で確認してください。

    pwd
    

    ここで、もう一度 cd - を使用して /home/labex/project/documents に戻ります。

    cd -
    

    そして pwd で確認します。

    pwd
    
  2. cd ..: このコマンドは、. (2 つのドット) という隠しディレクトリを使用して、親ディレクトリに 1 レベル上がります。親ディレクトリの正確な名前を知る必要はありません。

    cd ..
    

    これで /home/labex/project にいるはずです。pwd で確認してください。

    pwd
    

    .. を連鎖させることで、複数のレベルを上がることができます。例えば、/home/labex/project から /home/labex に移動するには次のようにします。

    cd ../
    

    場所を確認します。

    pwd
    

    /home/labex にいるはずです。

  3. cd(引数なし): このコマンドは、常にホームディレクトリに移動します。labex ユーザーの場合、これは /home/labex です。

    cd
    

    場所を確認します。

    pwd
    

    /home/labex にいるはずです。

さて、いくつかのファイルを作成するために、~/project/documents ディレクトリに戻りましょう。

cd ~/project/documents

場所を確認します。

pwd

出力は /home/labex/project/documents となるはずです。

ここで touch コマンドを使用します。touch コマンドは、ファイルを変更せずに、ファイルのタイムスタンプを現在の日付と時刻に更新します。このコマンドは、空のファイルを作成するためにも非常に役立ちます。

~/project/documents ディレクトリに report.txtnotes.txt という名前の 2 つの空のファイルを作成しましょう。

touch report.txt notes.txt

ls -l を使用してファイルが作成されたことを確認します。

ls -l

新しく作成されたファイルを示す、以下のような出力が表示されるはずです。

total 0
-rw-rw-r--. 1 labex labex 0 Mar  7 HH:MM report.txt
-rw-rw-r--. 1 labex labex 0 Mar  7 HH:MM notes.txt

最後に、~/project/documents 内に drafts という名前の新しいディレクトリを作成し、その中にファイルを作成しましょう。

mkdir drafts
cd drafts
touch draft_v1.txt

ファイルの作成を確認します。

ls -l

draft_v1.txt が一覧表示されているはずです。

これで、単一の cd コマンドを使用して ~/project ディレクトリに戻りましょう。

cd ~/project

場所を確認します。

pwd

出力は /home/labex/project となるはずです。

mkdir、cp、mv、rm でファイルとディレクトリを整理する

このステップでは、mkdir(make directory)、cp(copy)、mv(move/rename)、rm(remove)コマンドを使用して、ファイルとディレクトリを効果的に整理する方法を学びます。これらのコマンドは、クリーンで構造化されたファイルシステムを維持するために不可欠です。

まず、~/project ディレクトリにいることを確認します。

cd ~/project

現在の場所を確認します。

pwd

出力は /home/labex/project となるはずです。

mkdir: ディレクトリの作成

単一のディレクトリを作成するために mkdir をすでに使用しました。ここでは、より高度な mkdir オプションを探求しましょう。

引数としてリストすることで、複数のディレクトリを一度に作成できます。

mkdir reports presentations

作成を確認します。

ls

documentspresentationsreports が一覧表示されるはずです。

mkdir コマンドの -p(parents)オプションは、要求された宛先の親ディレクトリが存在しない場合にそれらを作成するのに非常に役立ちます。これにより、存在しない親ディレクトリ内にサブディレクトリを作成しようとした場合のエラーを防ぐことができます。

ネストされたディレクトリ構造 projects/alpha/docs を作成しましょう。

mkdir -p projects/alpha/docs

次に、ls -R を使用して新しく作成されたネストされた構造を表示します。

ls -R projects

以下のように表示されるはずです。

projects:
alpha

projects/alpha:
docs

projects/alpha/docs:

cp: ファイルとディレクトリのコピー

cp コマンドはファイルとディレクトリをコピーします。ファイルをコピーする場合、現在のディレクトリまたは指定された別のディレクトリに重複を作成します。

documents ディレクトリから reports ディレクトリに report.txt をコピーしましょう。

cp documents/report.txt reports/

reports ディレクトリの内容を一覧表示してコピーを確認します。

ls reports

reports ディレクトリに report.txt が表示されるはずです。

ターゲットディレクトリに同じ名前のファイルが存在する場合、cp はデフォルトでそれを上書きします。

ディレクトリとその内容をコピーするには、-r(recursive)オプションを使用する必要があります。デフォルトでは、-r が指定されていない場合、cp はディレクトリを無視します。

documents ディレクトリ全体を projects/alpha/ にコピーしましょう。

cp -r documents projects/alpha/

再帰的なコピーを確認します。

ls -R projects/alpha/documents

documents ディレクトリの内容(notes.txtdraftsdrafts/draft_v1.txt を含む)が projects/alpha/documents 内に複製されているはずです。

projects/alpha/documents:
drafts  notes.txt  report.txt

projects/alpha/documents/drafts:
draft_v1.txt

mv: ファイルとディレクトリの移動と名前の変更

mv コマンドはファイルをある場所から別の場所に移動します。ファイルやディレクトリの名前を変更するためにも使用できます。ファイルの絶対パスをそのフルネームと考えると、ファイルを移動することは、ファイルを名前変更することと実質的に同じです。移動されたファイルのコンテンツは変更されません。

documents ディレクトリ内の notes.txtmeeting_notes.txt に名前変更しましょう。

mv documents/notes.txt documents/meeting_notes.txt

名前の変更を確認します。

ls documents

notes.txt の代わりに meeting_notes.txt が表示されるはずです。

次に、reports ディレクトリから documents/draftsreport.txt を移動しましょう。

mv reports/report.txt documents/drafts/

移動を確認します。

ls reports

reports ディレクトリは空になっているはずです。

ls documents/drafts

documents/drafts ディレクトリに draft_v1.txtreport.txt が表示されるはずです。

mv-v オプションは、コマンド操作の詳細な出力を表示し、確認に役立ちます。

mv -v documents/meeting_notes.txt documents/final_notes.txt

以下のような出力が表示されます。

renamed 'documents/meeting_notes.txt' -> 'documents/final_notes.txt'

rm: ファイルとディレクトリの削除

rm コマンドはファイルを削除します。削除されたファイルは通常コマンドラインから回復できないため、rm には注意してください。

rm の練習のために一時ファイルを作成しましょう。

touch temp_file.txt

次に、temp_file.txt を削除します。

rm temp_file.txt

削除を確認します。

ls

temp_file.txt はもう一覧表示されないはずです。

デフォルトでは、rm はディレクトリを削除しません。正しいオプションなしで空でないディレクトリを削除しようとすると、エラーが発生します。

rm presentations

以下のようなエラーが表示されます。

rm: cannot remove 'presentations': Is a directory

ディレクトリとその内容を削除するには、-r(recursive)オプションを使用する必要があります。rm -r コマンドは、各サブディレクトリを個別に削除する前に、各サブディレクトリを再帰的に処理します。

presentations ディレクトリとその内容(現在は空ですが、ディレクトリには依然として -r が必要です)を削除しましょう。

rm -r presentations

削除を確認します。

ls

presentations はもう一覧表示されないはずです。

rm-i オプションは、各ファイルを削除する前に確認を求める対話的なプロンプトを表示します。これは良い安全対策です。

さらにいくつか一時ファイルを作成し、それらを対話的に削除しましょう。

touch file1.txt file2.txt
rm -i file1.txt file2.txt

各ファイルに対してプロンプトが表示されます。

rm: remove regular empty file 'file1.txt'? y
rm: remove regular empty file 'file2.txt'? y

削除を確認するために、各プロンプトで y を入力して Enter キーを押します。

-f オプション(force)は、ユーザーに確認を求めずに強制的に削除します。-i-f の両方を指定した場合、-f が優先されます。**-f は極めて慎重に使用してください。**

最後に、projects ディレクトリをクリーンアップしましょう。

rm -r projects

projects が削除されたことを確認します。

ls

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

rmdir コマンドを使用して空のディレクトリを削除することもできます。ディレクトリが空でない場合、失敗します。

空のディレクトリを作成し、rmdir で削除してみましょう。

mkdir empty_dir
rmdir empty_dir

削除を確認します。

ls

empty_dir はもう一覧表示されないはずです。

rmdir で空でないディレクトリを削除しようとすると、失敗します。

mkdir test_dir
touch test_dir/test_file.txt
rmdir test_dir

以下のようなエラーが表示されます。

rmdir: failed to remove 'test_dir': Directory not empty

空でないディレクトリには rm -r を使用することを忘れないでください。

rm -r test_dir

ln(ハードリンクとシンボリックリンク)でファイル間のリンクを作成する

このステップでは、ln コマンドを使用してファイル間にリンクを作成する方法を学びます。Linux ファイルシステムは、ハードリンクとシンボリック(またはソフト)リンクの 2 種類のリンクをサポートしています。これらの違いを理解することは、効果的なファイル管理のために不可欠です。

まず、~/project ディレクトリにいることを確認します。

cd ~/project

現在の場所を確認します。

pwd

出力は /home/labex/project となるはずです。

作業用に、original_file.txt という名前の新しいファイルを作成し、いくつかのコンテンツを追加しましょう。

echo "This is the content of the original file." > original_file.txt

ファイルの内容を確認します。

cat original_file.txt

ハードリンク

ハードリンクは、基本的に既存のファイルに対する別名です。ストレージデバイス上の同じデータ(inode)を、元のファイルと同じように直接指します。ハードリンクが作成された後、新しいハードリンクとファイルの元の名前との違いを区別することはできません。どちらも同じデータにアクセスするための等しく有効な方法です。

ls -l コマンドを使用して、ファイルに複数のハードリンクがあるかどうかを確認できます。ls -l 出力の 2 番目の列は、ファイルへのハードリンクの数を示します。

当初、original_file.txt には 1 つのハードリンク(それ自体)があります。

ls -l original_file.txt

以下のような出力が表示され、数字の 1 が 1 つのハードリンクを示しているはずです。

-rw-rw-r--. 1 labex labex 35 Mar  7 HH:MM original_file.txt

ここで、ln コマンドを使用して original_file.txt へのハードリンクを hard_link.txt という名前で作成しましょう。

ln original_file.txt hard_link.txt

両方のファイルのハードリンク数を確認します。

ls -l original_file.txt hard_link.txt

両方のファイルでハードリンク数が 2 になっているはずです。これは、それらが同じデータを指していることを示しています。

-rw-rw-r--. 2 labex labex 35 Mar  7 HH:MM hard_link.txt
-rw-rw-r--. 2 labex labex 35 Mar  7 HH:MM original_file.txt

それらが同じデータを指していることを確認するために、ls -i オプションを使用して各ファイルの inode 番号を一覧表示できます。ファイルが同じファイルシステム上にあり、それらの inode 番号が同じ場合、それらのファイルは同じデータファイルの内容を指すハードリンクです。

ls -i original_file.txt hard_link.txt

inode 番号は同一であるはずです。

1234567 original_file.txt  1234567 hard_link.txt

一方のファイルのコンテンツを変更すると、それらは同じ基盤データであるため、もう一方のファイルにも変更が反映されます。

echo "Adding new line." >> hard_link.txt
cat original_file.txt

以下のように表示されます。

This is the content of the original file.
Adding new line.

元のファイルが削除された場合でも、少なくとももう 1 つのハードリンクが存在する限り、ファイルのコンテンツにアクセスできます。データは、最後のハードリンクが削除され、ファイルの内容がいずれのハードリンクからも参照されなくなった場合にのみ、ストレージから削除されます。

original_file.txt を削除しましょう。

rm original_file.txt

次に、hard_link.txt にアクセスしてみます。

cat hard_link.txt

コンテンツは引き続き表示されます。

This is the content of the original file.
Adding new line.

hard_link.txt のハードリンク数は 1 になっているはずです。

ls -l hard_link.txt

ハードリンクの制限事項:

  • ハードリンクは通常のファイルにのみ使用できます。ln コマンドを使用して、ディレクトリや特殊ファイルへのハードリンクを作成することはできません。
  • ハードリンクは、両方のファイルが同じファイルシステム上にある場合にのみ使用できます。df コマンドを使用してファイルシステムを一覧表示できます。

シンボリックリンク

シンボリックリンク(「ソフトリンク」または「シンボリックリンク」とも呼ばれます)は、パスによって別のファイルまたはディレクトリを指す特別な種類のファイルです。Windows のショートカットに似ています。ハードリンクとは異なり、シンボリックリンクはデータ自体を直接指すのではなく、ターゲットファイルまたはディレクトリの名前を指します。

シンボリックリンク用の target_file.txt という名前の新しいファイルを作成しましょう。

echo "This is the target file for the symbolic link." > target_file.txt

次に、ln -s コマンドを使用して target_file.txt を指す sym_link.txt という名前のシンボリックリンクを作成します。

ln -s target_file.txt sym_link.txt

ls -l を使用してシンボリックリンクの詳細を確認します。

ls -l target_file.txt sym_link.txt

いくつかの違いに気づくでしょう。

  • sym_link.txt のロングリストの最初の文字は l(文字の l)であり、シンボリックリンクであることを示しています。
  • 出力は sym_link.txt -> target_file.txt と表示され、それが何を指しているかを明確に示しています。
  • シンボリックリンクのサイズは非常に小さく(ターゲットパスの長さのみ)、ターゲットファイルのサイズではありません。
  • sym_link.txt のハードリンク数は 1 です。
-rw-rw-r--. 1 labex labex 45 Mar  7 HH:MM target_file.txt
lrwxrwxrwx. 1 labex labex 14 Mar  7 HH:MM sym_link.txt -> target_file.txt

sym_link.txt を通じて target_file.txt のコンテンツにアクセスできます。

cat sym_link.txt

以下のように表示されます。

This is the target file for the symbolic link.

シンボリックリンクの主な違いと動作:

  • クロスファイルシステムリンク: シンボリックリンクは、異なるファイルシステム上の 2 つのファイルをリンクできます。

  • ディレクトリへのリンク: シンボリックリンクは、通常のファイルだけでなく、ディレクトリを指すこともできます。documents ディレクトリへのシンボリックリンクを作成しましょう。

    ln -s documents doc_shortcut
    

    これで、doc_shortcutcd することで、それが documents ディレクトリ自体であるかのように扱うことができます。

    cd doc_shortcut
    

    場所を確認します。pwd はデフォルトでシンボリックリンクのパスを表示することに注意してください。

    pwd
    

    出力:/home/labex/project/doc_shortcut

    pwd にシンボリックリンクが指しているディレクトリの実際のパスを表示させたい場合は、-P オプションを使用します。

    pwd -P
    

    出力:/home/labex/project/documents

    これで、~/project に戻ります。

    cd ~/project
    
  • 切れかけたシンボリックリンク: 元の通常のファイル(ターゲット)が削除されると、シンボリックリンクは存在し続けますが、存在しないファイルを指します。これは「切れかけたシンボリックリンク」と呼ばれます。

    target_file.txt を削除しましょう。

    rm target_file.txt
    

    次に、ls -lsym_link.txt を確認します。

    ls -l sym_link.txt
    

    sym_link.txt はまだ存在しますが、そのターゲット target_file.txt は、壊れていることを示すために赤色または異なる色(ターミナルの設定による)で表示されていることに気づくでしょう。

    lrwxrwxrwx. 1 labex labex 14 Mar  7 HH:MM sym_link.txt -> target_file.txt
    

    切れかけたシンボリックリンクを cat しようとすると失敗します。

    cat sym_link.txt
    

    出力:

    cat: sym_link.txt: No such file or directory
    

最後に、このステップで作成したファイルとリンクをクリーンアップしましょう。

rm hard_link.txt sym_link.txt doc_shortcut
ls

前のステップから残っているのは documentsreports ディレクトリのみのはずです。

シェル展開でファイルを効率的に選択する

In this step, you will learn how to efficiently select files and directories using various shell expansion features, including pattern matching (globbing), tilde expansion, brace expansion, variable expansion, and command substitution. These features allow you to perform operations on multiple files with concise commands.

First, ensure you are in your ~/project directory.

cd ~/project

Verify your current location:

pwd

The output should be /home/labex/project.

To demonstrate shell expansions, let's create a set of files and directories.

mkdir data
cd data
touch file1.txt file2.log file_a.txt file_b.log report_2023.txt report_2024.log
touch image.jpg document.pdf archive.zip
mkdir dir1 dir2 dir3
cd ..

Now, list the contents of the data directory to see the files you've created:

ls data

You should see:

archive.zip  dir1  dir2  dir3  document.pdf  file1.txt  file2.log  file_a.txt  file_b.log  image.jpg  report_2023.txt  report_2024.log

Pattern Matching (Globbing)

Pattern matching, also known as globbing, allows you to select files based on patterns using special characters called metacharacters.

Metacharacter Matches Example
* Any string of zero or more characters. *.txt matches all files ending with .txt.
? Any single character. file?.txt matches file1.txt, fileA.txt, etc.
[abc...] Any one character in the enclosed class. file[12].txt matches file1.txt or file2.txt.
[!abc...] Any one character not in the enclosed class. file[!1].txt matches fileA.txt but not file1.txt.
[[:alpha:]] Any alphabetic character. file[[:alpha:]].txt matches fileA.txt.
[[:digit:]] Any single digit from 0 to 9. file[[:digit:]].txt matches file1.txt.

Let's try some examples within the data directory.

  1. Using *: List all files ending with .txt:

    ls data/*.txt
    

    Output:

    data/file1.txt  data/file_a.txt  data/report_2023.txt
    

    List all files containing file in their name:

    ls data/*file*
    

    Output:

    data/file1.txt  data/file2.log  data/file_a.txt  data/file_b.log
    
  2. Using ?: List files that have exactly one character before .log:

    ls data/file?.log
    

    Output:

    data/file2.log
    
  3. Using [] for character sets: List files that start with report_ and have either 2023 or 2024 in their name:

    ls data/report_[2][0][2][34].*
    

    Output:

    data/report_2023.txt  data/report_2024.log
    
  4. Using {} for brace expansion: List files starting with file and ending with .txt or .log:

    ls data/file*.{txt,log}
    

    Output:

    data/file1.txt  data/file2.log  data/file_a.txt  data/file_b.log
    

Tilde Expansion ~

The tilde (~) character expands to the current user's home directory (/home/labex). When followed by a username, it expands to that user's home directory.

echo ~

Output:

/home/labex
echo ~root

Output:

/root
echo ~/project/data

Output:

/home/labex/project/data

Brace Expansion {}

Brace expansion generates arbitrary strings. It's useful for creating lists of files or directories with similar names without typing each one individually.

  1. Comma-separated list: Create files report_jan.txt, report_feb.txt, report_mar.txt:

    touch data/report_{jan,feb,mar}.txt
    

    List them:

    ls data/report_*.txt
    

    Output:

    data/report_2023.txt  data/report_jan.txt  data/report_feb.txt  data/report_mar.txt
    
  2. Range of numbers or letters: Create files doc1.txt, doc2.txt, doc3.txt:

    touch data/doc{1..3}.txt
    

    List them:

    ls data/doc*.txt
    

    Output:

    data/doc1.txt  data/doc2.txt  data/doc3.txt
    

    Create directories chapterA, chapterB, chapterC:

    mkdir data/chapter{A..C}
    

    List them:

    ls data/chapter*
    

    Output:

    data/chapterA  data/chapterB  data/chapterC
    

Variable Expansion

Shell variables store values that can be expanded in commands. You define a variable using VARNAME=value and access its value using $VARNAME or ${VARNAME}.

MY_DIR=data
echo "My directory is: $MY_DIR"

Output:

My directory is: data

You can use variables in commands:

ls $MY_DIR

Output will be the contents of the data directory.

Command Substitution

Command substitution allows you to use the output of a command as part of another command. This is done by enclosing the command in $(command) or backticks `command`. The $(command) syntax is generally preferred as it can be nested.

Let's get the current date and use it in a file name.

touch data/log_$(date +%Y-%m-%d).txt

List the data directory to see the new file:

ls data/log_*.txt

Output will be similar to:

data/log_2024-03-07.txt

You can also use it to count files:

echo "There are $(ls data | wc -l) items in the data directory."

Output will be similar to:

There are 19 items in the data directory.

Protecting Arguments from Expansion

Sometimes, you want to prevent the shell from expanding certain characters. You can do this using:

  1. Backslash (\): Escapes the next single character.

    echo "The value of \$HOME is your home directory."
    

    Output:

    The value of $HOME is your home directory.
    
  2. Single quotes (''): Prevent all shell expansion within the quotes.

    echo 'The current date is $(date +%Y-%m-%d).'
    

    Output:

    The current date is $(date +%Y-%m-%d).
    
  3. Double quotes (""): Prevent most shell expansion, but allow variable expansion ($VAR) and command substitution ($()).

    MY_DATE=$(date +%Y-%m-%d)
    echo "Today's date is $MY_DATE."
    

    Output:

    Today's date is 2024-03-07.
    

    Compare with single quotes:

    echo 'Today is $MY_DATE.'
    

    Output:

    Today's date is $MY_DATE.
    

Finally, let's clean up the data directory.

rm -r data

まとめ

この実験では、RHEL でファイルやディレクトリを管理するための基本的なコマンドラインツールを学びました。まず、現在の作業ディレクトリを特定するための pwd と、詳細情報のための -l や隠しファイルを表示するための -a などのオプションを使用してディレクトリの内容を一覧表示する ls を習得しました。次に、cd を使用してファイルシステムを移動し、touch を使用して新しいファイルを作成しました。

さらに、mkdir を使用してディレクトリを作成し、cp を使用してファイルやディレクトリをコピーし、mv を使用してそれらを移動または名前変更し、rm を使用してそれらを削除することで、ファイルシステムを整理する能力を習得しました。この実験では、ln を使用したハードリンクとシンボリックリンクの作成、およびシェル展開を使用した効率的なファイル選択方法についてもカバーし、コマンドラインからファイルやディレクトリを効果的に管理する能力を向上させました。