1. 概要

ご存知のように、Linuxコマンドラインでは、通常のファイルへのリンクを作成できます。 ディレクトリへのリンクを作成したい場合があります。

このクイックチュートリアルでは、lnコマンドを使用してこれを行う方法を見ていきます。

ハードリンクではなく、シンボリック(ソフト)リンクの作成に焦点を当てます。 

2. 1つの単一ディレクトリへのリンクの作成

1つのディレクトリへのリンクを作成することは、lnコマンドの一般的な使用例です。 構文は、ファイルへのソフトリンクを作成するのと同じです。

ln -s TARGET_DIR LINK_NAME

それでは、実際の動作を見てみましょう。 / tmp / test/linked_etcディレクトリから/etcディレクトリへのソフトリンクを作成しましょう。

$ ln -s /etc /tmp/test/linked_etc
$ stat /tmp/test/linked_etc
  File: /tmp/test/linked_etc -> /etc
  Size: 4               Blocks: 0          IO Block: 4096   symbolic link
Device: 30h/48d Inode: 46728       Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1000/    kent)   Gid: ( 1000/    kent)
...

ln コマンドを使用してリンクを作成した後、statコマンドを使用して/tmp / test/linked_etcの詳細情報を一覧表示しました。

stat コマンドの出力では、シンボリックリンクが正常に作成されたことがわかります。

LINK_NAMEを指定しない場合、lnコマンドは、現在の作業ディレクトリの下にターゲットディレクトリの名前でリンクを作成します。

$ pwd
/tmp/test

$ ln -s /etc
$ stat /tmp/test/etc
  File: /tmp/test/etc -> /etc
  Size: 4               Blocks: 0          IO Block: 4096   symbolic link
Device: 30h/48d Inode: 46735       Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1000/    kent)   Gid: ( 1000/    kent)
...

例が示すように、リンクetcは現在の作業ディレクトリ/tmp/test.の下に作成されています。

3. 複数のディレクトリへのリンクの作成

単一のディレクトリへのリンクを作成する方法を見てきました。 ln コマンドを使用すると、複数のターゲットディレクトリへのリンクを一度に作成できます。

それでは、それを行うための構文を見てみましょう。

ln -s -t DIR_TO_CREATE_LINKS ​TARGET_DIR1 TARGET_DIR2 ... 

いつものように、例を通してコマンドがどのように機能するかを理解しましょう。

/ tmp /testの下にJavaJDKディレクトリ/usr / lib / jvm /java-15-jdkとPythonディレクトリを指す2つのソフトリンクを作成するとします。 /usr/lib/python3.9

$ ln -s -t /tmp/test /usr/lib/jvm/java-15-jdk /usr/lib/python3.9 

$ stat /tmp/test/java-15-jdk /tmp/test/python3.9 
  File: /tmp/test/java-15-jdk -> /usr/lib/jvm/java-15-jdk
  Size: 24              Blocks: 0          IO Block: 4096   symbolic link
Device: 30h/48d Inode: 46771       Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1000/    kent)   Gid: ( 1000/    kent)
 ...
  File: /tmp/test/python3.9 -> /usr/lib/python3.9
  Size: 18              Blocks: 0          IO Block: 4096   symbolic link
Device: 30h/48d Inode: 46772       Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1000/    kent)   Gid: ( 1000/    kent)
...

上記のstatの出力が示すように、2つのリンクはディレクトリ / tmp / test の下に作成され、目的のターゲットディレクトリを指します。

または、別の形式で複数のディレクトリへのリンクを作成することもできます。

ln -s TARGET_DIR1 TARGET_DIR2 ... DIR_TO_CREATE_LINKS

今回は、-tオプションは使用しません。 代わりに、DIR_TO_CREATE_LINKSディレクトリを引数リストの最後に配置します。

例は、コマンドがどのように機能するかを説明するための優れた方法です。

それでは、新しいディレクトリ / tmp /test2の下にPythonおよびJavaディレクトリへのリンクを作成しましょう。

$ ln -s /usr/lib/jvm/java-15-jdk /usr/lib/python3.9 /tmp/test2 

$ stat /tmp/test2/java-15-jdk /tmp/test2/python3.9
  File: /tmp/test2/java-15-jdk -> /usr/lib/jvm/java-15-jdk
  Size: 24              Blocks: 0          IO Block: 4096   symbolic link
Device: 30h/48d Inode: 46811       Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1000/    kent)   Gid: ( 1000/    kent)
...
  File: /tmp/test2/python3.9 -> /usr/lib/python3.9
  Size: 18              Blocks: 0          IO Block: 4096   symbolic link
Device: 30h/48d Inode: 46812       Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1000/    kent)   Gid: ( 1000/    kent)
...

stat 出力は、 / tmp/test2。の下に2つのリンクが作成されたことを示しています。

4. 権限

これまで、ディレクトリへのソフトリンクを作成するのがいかに簡単かを学びました。

また、 stat コマンドの上記のすべての出力を注意深く読むと、すべてのソフトリンクのアクセス許可が同じであることがわかります: 0777 /lrwxrwxrwx

Linuxでは、シンボリックリンクのファイルシステム権限は使用されないことに注意してください。 許可は常にです 0777。 

ターゲットファイル自体のアクセス許可は、ターゲットファイルまたはディレクトリのアクセスモードを制御します。

さらに、ソフトリンクの権限を変更すると、chmodコマンドはその変更をターゲットファイルまたはディレクトリに転送します。 変更が成功したかどうかに関係なく、ソフトリンクの許可は0777です。

例を通してそれを理解しましょう。

まず、リンクしたい2つのディレクトリを見つけましょう。

kent$ ls -ld /etc /home/kent/Desktop/aDirectory 
drwxr-xr-x 131 root root 12288 Mar 26 11:07 /etc
drwxr-xr-x   2 kent kent  4096 Mar 26 23:23 /home/kent/Desktop/aDirectory

次に、ディレクトリ / tmp /test3の下に上記のディレクトリへの2つのリンクを作成します。

kent$ ln -s /etc /home/kent/Desktop/aDirectory /tmp/test3

kent$ ls -l /tmp/test3/*
lrwxrwxrwx 1 kent kent 29 Mar 26 23:27 /tmp/test3/aDirectory -> /home/kent/Desktop/aDirectory/
lrwxrwxrwx 1 kent kent  4 Mar 26 23:27 /tmp/test3/etc -> /etc/

よし、2つのリンクを作成しました。 最後に、2つのソフトリンクのアクセス許可を 700:に変更してみましょう。

kent$ chmod 700 /tmp/test3/etc 
chmod: changing permissions of '/tmp/test3/etc': Operation not permitted

ソフトリンク/tmp / test3 / etc。のアクセス許可を変更できません。これは、chmodコマンドがアクセス許可の変更をターゲットディレクトリ/etcに適用するためです。 ]。

どうやら、通常のユーザー「 kent」として、/etc。の権限を変更することは許可されていません。

次に、他のリンクの権限を変更するとどうなるか見てみましょう。

kent$ chmod 700 /tmp/test3/aDirectory

kent$ ls -ld /home/kent/Desktop/aDirectory
drwx------ 2 kent kent 4096 Mar 26 23:23 /home/kent/Desktop/aDirectory/

出力が示すように、ターゲットディレクトリ / home / kent / Desktop /aDirectoryの権限が「drwxr-xr-x」から「drwx-」に変更されました。 」。

最後に、2つのchmodコマンドが2つのソフトリンクの許可に影響するかどうかを確認しましょう。

kent$ ls -l /tmp/test3/*
lrwxrwxrwx 1 kent kent 29 Mar 26 23:27 /tmp/test3/aDirectory -> /home/kent/Desktop/aDirectory/
lrwxrwxrwx 1 kent kent  4 Mar 26 23:27 /tmp/test3/etc -> /etc/

したがって、ソフトリンクのアクセス許可を変更することはできません。常に777です。

5. 結論

この記事では、例を通じてディレクトリへのソフトリンクを作成する方法を学びました。

さらに、ソフトリンクのアクセス許可とchmodを使用してそれらを変更しようとすることの意味について説明しました。