Memo

メモ > サーバ > 各論: コマンド > ハードリンクとシンボリックリンク

ハードリンクとシンボリックリンク
【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

Advertisement