rm -rfはシンボリックリンクに従いますか?


72

私はこのようなディレクトリを持っています:

$ 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より上のディレクトリから実行する場合の正確な動作はどうなりますか?


16
ダミーファイルを指すシンボリックリンクを使用してダミーディレクトリを作成し、シナリオを実行するのはどれくらい難しいですか その後、あなたはそれがどのように機能するかを確実に知るでしょう!

回答:


57

例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(ストレッチ)システムで行われました。


12
rm -rf baz / *は内容を削除します
Wyrmwood 14年

2
はい、rm -rf [symlink]を実行すると、元のディレクトリの内容は消去されます!十分気をつける。
バトルビュートス

@frnknstnそうですね。私の最新のDebianシステムであなたが言及したのと同じ振る舞いを見ます。以前の実験を行ったDebianのバージョンを覚えていません。Debianの古いバージョンでの以前の実験では、3番目の例でa.txtが残っているか、実験でエラーを犯したに違いありません。私はDebian 9で観察している現在の動作で回答を更新しましたが、この動作はあなたが述べたことと一致しています。
スサムパル

19

lsを実行したディレクトリをrm -rfすると、/ home / me / msgディレクトリは安全になります。シンボリックリンク自体のみが削除され、それが指すディレクトリは削除されません。

私が注意する唯一のことは、「rm -rf msg /」(末尾のスラッシュ付き)のようなものを呼び出した場合です。これはしないでください。自体。


3
「私が注意する唯一のことは、「rm -rf msg /」(末尾のスラッシュ付き)のようなものを呼び出した場合です。msgではなく、msgが指すディレクトリを削除するため、それをしないでください。シンボリックリンク自体。」-私はこれが真実だとは思わない。以下の私の応答の3番目の例を参照してください。

1
@Susamと同じ結果が得られます( 'rm -r symlink /'はsymlinkのターゲットを削除しません)。これは非常に簡単な間違いであるため、満足しています。
アンドリュークラブ

5

rmファイルとディレクトリを削除する必要があります。ファイルがシンボリックリンクの場合、リンクはターゲットではなく削除されます。シンボリックリンクを解釈しません。たとえば、「壊れたリンク」を削除するときの動作はどうあるべきですか?rmは、失敗を示すために、ゼロ以外ではなく0で終了します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.