メモ > サーバ > 各論: コマンド > ハードリンクとシンボリックリンク
ハードリンクとシンボリックリンク
【Linux】lnコマンドでファイルのリンクを作成してみよう | 侍エンジニアブログ
https://www.sejuku.net/blog/50103
lnコマンドめっちゃ便利。 #Linuxコマンド - Qiita
https://qiita.com/mitsumizo/items/3c266699d9ca7a712108
【ln -s】世界一シンプルなシンボリックリンクまとめ [Linux] #Linux - Qiita
https://qiita.com/takuyanin/items/3682ac19bbbc21792849
シンボリックリンクの作成と削除 #Linux - Qiita
https://qiita.com/colorrabbit/items/2e99304bd92201261c60
■ファイルに対するハードリンク
ハードリンクを設定する(1つのファイルの実体に複数の名前を付ける)
$ vi test.txt
$ cat test.txt
TEST
$ ln test.txt h_test.txt
$ ll
-rw-r--r-- 2 apache apache 6 10月 3 17:38 h_test.txt
-rw-r--r-- 2 apache apache 6 10月 3 17:37 test.txt
$ cat test.txt
TEST
$ cat h_test.txt
TEST
リンク元のファイルを編集すると、リンク先ファイルにも反映される
$ vi test.txt
$ cat test.txt
TEST
TEST
$ cat h_test.txt
TEST
TEST
どちらも本物のファイルなので、元々のファイルである test.txt を削除しても h_test.txt を読み書きできる。
$ rm test.txt
$ cat h_test.txt
TEST
TEST
■ファイルに対するシンボリックリンク
シンボリックリンクを設定する(Windowsでいうショートカットを作成する。リンク先が実体ファイル)
$ vi test.txt
$ cat test.txt
TEST
$ ln -s test.txt s_test.txt
$ ll
lrwxrwxrwx 1 apache apache 8 10月 3 17:47 s_test.txt -> test.txt
-rw-r--r-- 1 apache apache 6 10月 3 17:46 test.txt
$ cat test.txt
TEST
$ cat s_test.txt
TEST
リンク元のファイルを編集すると、リンク先ファイルにも反映される
$ vi test.txt
$ cat test.txt
TEST
TEST
$ cat s_test.txt
TEST
TEST
リンク先のファイルが削除されると、内容を参照できなくなる
$ rm test.txt
$ ll
lrwxrwxrwx 1 apache apache 8 10月 3 17:47 s_test.txt -> test.txt
$ cat s_test.txt
cat: s_test.txt: No such file or directory
■ディレクトリに対するハードリンク
ディレクトリに対してハードリンクを作成することはできない
$ mkdir test
$ vi test/test.txt
$ cat test/test.txt
TEST
$ ln test h_test
ln: `test': ディレクトリに対するハードリンクは許可されていません
■ディレクトリに対するシンボリックリンク
シンボリックリンクを設定すると、どちらからでもディレクトリの内容を参照できる
$ mkdir test
$ vi test/test.txt
$ cat test/test.txt
TEST
$ ln -s test s_test
$ ll
lrwxrwxrwx 1 apache apache 4 10月 3 18:12 s_test -> test
drwxr-xr-x 2 apache apache 22 10月 3 18:10 test
$ ll test
-rw-r--r-- 1 apache apache 6 10月 3 18:10 test.txt
$ ll s_test/
-rw-r--r-- 1 apache apache 6 10月 3 18:10 test.txt
$ pwd
/home/webmaster
$ cd test
$ pwd
/home/webmaster/test
$ cd -
/home/webmaster
$ cd s_test/
$ pwd
/home/webmaster/s_test
ディレクトリへのシンボリックリンクは、通常どおりunlinkコマンドで削除できる
ただし最後に「/」を付けると、ディレクトリとみなされてシンボリックリンク(ファイル)を削除できないので注意
$ unlink s_test/
unlink: `s_test/' を削除 (unlink) できません: Not a directory
$ ll
合計 0
lrwxrwxrwx 1 apache apache 4 10月 3 18:12 s_test -> test
drwxr-xr-x 2 apache apache 22 10月 3 18:10 test
$ unlink s_test
$ ll
合計 0
drwxr-xr-x 2 apache apache 22 10月 3 18:10 test
■ディレクトリに対するシンボリックリンク(使用例)
以下のとおりシンボリックリンクを作成し、ブラウザから test/ にアクセスすると test1/index.html の内容が表示される
$ mkdir test1
$ vi test1/index.html
$ cat test1/index.html
test1
$ ln -s test1 test
$ ll
lrwxrwxrwx 1 apache apache 5 10月 3 18:25 test -> test1
drwxr-xr-x 2 apache apache 24 10月 3 18:24 test1
以下のようにするとリンクの張り替えができる
作業ファイルをディレクトリごとアップロードし、リンク先をそこに向けることで、過去のファイルを丸ごと残したバージョン管理ができる
以前のバージョンに戻す場合、リンク先を元に戻すだけで対応できる
(もちろん過去の領域ではすべてのファイルが残っているため、ディスクの消費量が大きくなるので注意が必要)
※シンボリックリンクの張り替えは「f」オプションが必要(リンクが存在する場合、既存のリンクを削除する)
対象がディレクトリの場合は「n」オプションも必要(リンクが存在してリンク先がディレクトリの場合、リンクを通常ファイルとして扱う)
$ mkdir test2
$ vi test2/index.html
$ cat test2/index.html
test2
$ ln -nfs test2 test
$ ll
lrwxrwxrwx 1 apache apache 5 10月 3 18:31 test -> test2
drwxr-xr-x 2 apache apache 37 10月 3 18:27 test1
drwxr-xr-x 2 apache apache 24 10月 3 18:27 test2
なお以下のようにすると、シンボリックリンクが存在する場合にエラーになる
$ ln -s test2 test
ln: シンボリックリンク `test/test2' の作成に失敗しました: File exists
シンボリックリンクの向き先変更(ln -nfs TARGET LINK_NAME) #UNIX - Qiita
https://qiita.com/takeoverjp/items/bb1576e90a8a495db4b3
lnコマンドのnオプションについて #コマンド - Qiita
https://qiita.com/Railroad3551/items/be14c1da32113f74aaa3