こんな感じのディレクトリを持っています
$ ls -l
total 899166
drwxr-xr-x 12 me scicomp 324 Jan 24 13:47 data
-rw-r--r-- 1 me scicomp 84188 Jan 24 13:47 lod-thin-1.000000-0.010000-0.030000.rda
drwxr-xr-x 2 me scicomp 808 Jan 24 13:47 log
lrwxrwxrwx 1 me scicomp 17 Jan 25 09:41 msg -> /home/me/msg
そして、rm -r
を使って削除したい
しかし、rm -r
がシンボリックリンクを辿って、そのディレクトリ内のすべてを削除してしまうのが怖いです(これは非常に悪いことです)
このことについては、マニュアルページには何も書いてありません。この上のディレクトリからrm -rf
を実行した場合の正確な動作は?
79 Greg 2012-01-25
例1.別のディレクトリへのソフトリンクを含むディレクトリを削除します
susam@nifty:~/so$ mkdir foo bar
susam@nifty:~/so$ touch bar/a.txt
susam@nifty:~/so$ ln -s /home/susam/so/bar/ foo/baz
susam@nifty:~/so$ tree
.
├── bar
│ └── a.txt
└── foo
└── baz -> /home/susam/so/bar/
3 directories, 1 file
susam@nifty:~/so$ rm -r foo
susam@nifty:~/so$ tree
.
└── bar
└── a.txt
1 directory, 1 file
susam@nifty:~/so$
ということで、ソフトリンクのターゲットが生き残っていることがわかります
例2.ディレクトリへのソフトリンクの削除
susam@nifty:~/so$ ln -s /home/susam/so/bar baz
susam@nifty:~/so$ tree
.
├── bar
│ └── a.txt
└── baz -> /home/susam/so/bar
2 directories, 1 file
susam@nifty:~/so$ rm -r baz
susam@nifty:~/so$ tree
.
└── bar
└── a.txt
1 directory, 1 file
susam@nifty:~/so$
ソフトリンクだけが削除されます。ソフトリンクの対象は生き残ります
例3:ソフトリンクのターゲットを削除しようとした場合
susam@nifty:~/so$ ln -s /home/susam/so/bar baz
susam@nifty:~/so$ tree
.
├── bar
│ └── a.txt
└── baz -> /home/susam/so/bar
2 directories, 1 file
susam@nifty:~/so$ rm -r baz/
rm: cannot remove 'baz/': Not a directory
susam@nifty:~/so$ tree
.
├── bar
└── baz -> /home/susam/so/bar
2 directories, 0 files
シンボリックリンク先のファイルが生き残らない
上記の実験は、Debian GNU/Linux 9.0 (stretch) システムで行いました
63 Susam Pal 2012-01-25
あなたの /home/me/msg ディレクトリは、ls を実行したディレクトリを rm -rf することで安全になります。シンボリックリンク自体だけが削除され、それが指すディレクトリは削除されません
唯一注意したいのは、”rm -rf msg/”のように(最後にスラッシュを付けて)呼び出すことです
20 Ken Simon 2012-01-25
rm
はファイルとディレクトリを削除する必要があります。ファイルがシンボリックリンクの場合は、対象ではなくリンクが削除されます。シンボリックリンクは解釈されません。例えば、’broken links’を削除するときの動作はどうあるべきか – rmは失敗を示すために0以外の0ではなく0で終了します
5 Jayan 2012-01-26