はじめに
この実験では、Linux のファイルがシンボリックリンクかどうかを判断する方法を学びます。これを達成するための 3 つの異なる方法を探索します。
まず、test コマンドと -L オプションを使用して、プログラム的にファイルの種類をチェックします。次に、ls -l コマンドの出力を調べることで、リンク情報を検証します。最後に、readlink コマンドを使用して、シンボリックリンクが指すターゲットファイルまたはディレクトリを解決する方法を学びます。
test -L でシンボリックリンクをテストする
このステップでは、test コマンドと -L オプションを使用して、ファイルがシンボリックリンクかどうかをテストする方法を学びます。
シンボリックリンク(またはシンリンク)は、別のファイルまたはディレクトリを指す特殊な種類のファイルです。Windows のショートカットのようなものと考えてください。シンボリックリンクにアクセスすると、実際にはそれが指すファイルまたはディレクトリにアクセスしています。
まず、簡単なファイルを作成しましょう。~/project ディレクトリにいることを確認してください。
echo "This is the original file." > original_file.txt
次に、original_file.txt へのシンボリックリンクを作成しましょう。シンボリックリンクの名前は my_symlink とします。
ln -s original_file.txt my_symlink
ln: リンクを作成するために使用されるコマンド。-s: このオプションは、lnにシンボリックリンク(ハードリンクではなく)を作成するよう指示します。original_file.txt: シンボリックリンクが指すターゲットファイル。my_symlink: 作成するシンボリックリンクの名前。
これで、test コマンドを使用して、my_symlink がシンボリックリンクかどうかをチェックできます。test コマンドは、ファイルの種類をチェックしたり、値を比較したりするために使用されます。直接出力は生成されませんが、終了ステータスが成功(0)または失敗(0 以外)を示します。
test を echo と組み合わせて結果を確認できます。
test -L my_symlink && echo "my_symlink is a symbolic link" || echo "my_symlink is NOT a symbolic link"
test -L my_symlink: これはmy_symlinkがシンボリックリンクかどうかをチェックします。&&: これは論理 AND 演算子です。&&の前のコマンドが成功する(終了ステータス 0)場合、&&の後のコマンドが実行されます。||: これは論理 OR 演算子です。||の前のコマンドが失敗する(終了ステータス 0 以外)場合、||の後のコマンドが実行されます。
my_symlink は確かにシンボリックリンクなので、出力は次のようになります。
my_symlink is a symbolic link
次に、通常のファイル、例えば original_file.txt をテストしてみましょう。
test -L original_file.txt && echo "original_file.txt is a symbolic link" || echo "original_file.txt is NOT a symbolic link"
出力は次のようになります。
original_file.txt is NOT a symbolic link
これにより、test -L がシンボリックリンクを正しく識別することが確認されました。
ls -l の出力でリンクを確認する
このステップでは、ls -l コマンドを使用してシンボリックリンクとそのターゲットを識別する方法を学びます。
ls コマンドは、ファイルやディレクトリを一覧表示するために使用されます。-l オプションは「詳細一覧」形式を提供し、各ファイルに関する詳細情報、例えばパーミッション、所有者、サイズ、変更時刻などが含まれます。
シンボリックリンクに対して ls -l を使用すると、リンク自体が表示され、それが指すものも示されます。
前のステップで original_file.txt と my_symlink を作成した ~/project ディレクトリにいることを確認してください。
次に、ls -l コマンドを実行します。
ls -l
以下のような出力が表示されるはずです。
total 4
-rw-rw-r-- 1 labex labex 25 Feb 28 10:00 original_file.txt
lrwxrwxrwx 1 labex labex 15 Feb 28 10:00 my_symlink -> original_file.txt
my_symlink の出力を分解してみましょう。
- 最初の文字
lは、これがシンボリックリンクであることを示しています。通常のファイルの場合は-になります。 - パーミッション (
rwxrwxrwx) は、シンボリックリンクではしばしば全パーミッションとして表示されますが、実際のパーミッションはターゲットファイルによって決まります。 - リンクカウントは、シンボリックリンクの場合は通常
1です。 - 所有者とグループは
labexです。 - サイズ (
15) は、ターゲットパス (original_file.txt) の文字数です。 - タイムスタンプは、シンボリックリンク自体の作成または変更時刻です。
my_symlink: シンボリックリンクの名前。-> original_file.txt: この部分は、my_symlinkがoriginal_file.txtを指していることを明確に示しています。
これを original_file.txt の出力と比較してみましょう。
- 最初の文字
-は、これが通常のファイルであることを示しています。 - パーミッション (
rw-rw-r--) は、誰がファイルを読み取り、書き込み、実行できるかを示しています。 - リンクカウント (
1) は、このファイルのデータを指すハードリンクの数を示しています。 - サイズ (
25) は、ファイル内容の実際のサイズ(バイト)です。
ls -l を使用することは、シンボリックリンクを迅速に識別し、それがどこを指しているかを確認するための非常に一般的な方法です。
readlink を使用してリンク先を解決する
このステップでは、readlink コマンドを使用してシンボリックリンクのターゲットを見つける方法を学びます。
ls -l は視覚的な概要を把握するのに便利ですが、readlink コマンドはシンボリックリンクを解決し、そのターゲットパスを出力するように特別に設計されています。これは、スクリプト内で、または他のファイル情報を必要とせずにターゲットパスだけが必要な場合に特に有用です。
~/project ディレクトリにいることを確認してください。
前のステップで作成したシンボリックリンク my_symlink に対して readlink コマンドを使用します。
readlink my_symlink
出力は、シンボリックリンクが指すパスになります。
original_file.txt
これにより、my_symlink が実際に original_file.txt を指していることが確認されます。
readlink コマンドには便利なオプション -f があり、これはすべてのシンボリックリンクを再帰的にたどり、最終的なターゲットの絶対パスに解決します。これは、シンボリックリンクのチェーンがある場合に役立ちます。
my_symlink を指す別のシンボリックリンクを作成しましょう。
ln -s my_symlink another_link
ここで、-f オプションを使用せずに readlink を another_link に対して使用すると、直近のターゲットが表示されます。
readlink another_link
出力:
my_symlink
しかし、another_link に対して readlink -f を使用すると、チェーン (another_link -> my_symlink -> original_file.txt) をたどり、最終的なターゲットの絶対パスが表示されます。
readlink -f another_link
出力:
/home/labex/project/original_file.txt
これは、元のファイルへの完全なパスを示しています。readlink -f コマンドは、リンクが他のリンクの中にネストされている場合でも、リンクの最終的な目的地を見つけるのに非常に強力です。
これで、シンボリックリンクを操作する 3 つの方法を学びました。test -L を使用してファイルがリンクかどうかをチェックする方法、ls -l を使用してリンクの詳細とターゲットを確認する方法、そして readlink を使用してターゲットパスを解決する方法です。
まとめ
この実験では、Linux でファイルがシンボリックリンクかどうかを確認する方法を学びました。まず、通常のファイルとそれを指すシンボリックリンクを作成しました。次に、test コマンドと -L オプションを使用して、指定されたファイルがシンボリックリンクかどうかをプログラム的に判断し、その終了ステータスを論理演算子 (&& と ||) と組み合わせて結果を表示する方法を確認しました。
また、ls -l コマンドを使用してシンボリックリンクを視覚的に検証する方法も学びました。このコマンドは、パーミッションフィールドの先頭に 'l' を表示し、リンクのターゲットを示します。最後に、readlink コマンドを使ってシンボリックリンクのターゲットパスを解決する方法を調べ、スクリプトや自動化におけるその有用性を理解しました。



