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
なるものが紹介されていた。
ソースがすっげー簡単。
-
普通に homebrew にあるじゃん。入れてから気付いた。 ↩