LoginSignup
9
5

More than 1 year has passed since last update.

ディレクトリ自体のハードリンクに関しての覚え書き

Last updated at Posted at 2015-09-11

2022/09/14 追記

文章は残すが、2022/09現在、 macOS Monterey + Gnu coreutils 9.1 の組合せでは、sudo を効かせても動かない。

suについては未確認。

また、hln コマンドも homebrew のリストから消えている。



特定の OS やらを除いて、ディレクトリ自体のハードリンクは作れない。とされてたんだけど。

GNU coreutils

ln -F として、ディレクトリ自体のハードリンクを作るオプションが用意されてる。
で、使う気もないのに一通り挙動を、、、

@CentOS6

前々から入っていた。
man に警告されている通り、 OS の制約からか、sudo しても Operation not permitted が出て動かない。

@OSX1

$ wget -q ftp://ftp.gnu.org/gnu/coreutils/coreutils-8.20.tar.xz
$ xz -dv  coreutils-8.20.tar.xz
$ tar -xvf coreutils-8.20.tar
$ ./configure --prefix=${HOME}/cmd && make && make install

あれ? 普通に動くぞ?
しかも sudo 無しで。
っつー事で、挙動確認のメモ

挙動確認

同じディレクトリにはリンク出来ない。

$ mkdir foo bar
$ touch foo/foo.txt
$ ln -F foo buz
ln: failed to create hard link ‘buz’ => ‘foo’: Operation not permitted

違うディレクトリにはリンク出来る。

$ ln -F foo bar/buz
  • ls -ali でリンク数を見ても、ファイル数が含まれる為、ハードリンクがされているか否かの判断はしにくい。
  • find . -inum とかで、確認は取れる。

rm -rf

$ rm -rf bar/buz
$ ls *
bar:

foo:

ハードリンクされたディレクトリを rm -rf すると当然中身は消える。
foo の中にも残らない。<= 当たり前

この状態の foo の中に入って、ln -F してみると

この状態だと、foo は素のディレクトリの状態に戻ってると期待するものの、、、

$ cd foo
$ touch foo/foo.txt
$ ln -F foo bar/buz
ln: failed to create hard link ‘bar/foo’ => ‘foo’: Operation not permitted  

同じ名前が悪いのか? と思って別の名前でやってみる。

$ mkdir 1 2
$ ln -F 1 2/2
ln: failed to create hard link ‘2/2’ => ‘1’: Operation not permitted

循環が怖いってのは理解出来るが、ハードリンク先を消したディレクトリでも、中ではハードリンクは作れなくなるっぽい、、、

man とか見て調べるのもかったるいから、この辺で止め。

余談

hln なるものが紹介されていた。

ソースがすっげー簡単。

  1. 普通に homebrew にあるじゃん。入れてから気付いた。

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5