ディレクトリをコピーしましたが、その中のファイルが削除されるのはcp -as /media/user/dir symlinks
怖いです。rm -rf symlinks
/media/user/dir
ディレクトリ構造とシンボリックリンクのみを削除する安全な方法は何ですかsymlinks
いいえ何でも触れますか/media/user/dir
?
テストで次のようにしました。
$ mkdir test
$ touch test/file
$ mkdir test/dir
$ touch test/dir/file2
$ cp -as test syms
$ rm -rf syms
このテストでは元のディレクトリに触れませんでした test
。これは完全なテストですか?いつもこんな感じですか?
バックアップするスペースがありません。/media/user/dir
答え1
元のファイルも削除されることを心配することなく、シンボリックリンクを含むディレクトリを削除できます。
rm
このユーティリティのPOSIX仕様(シンボリックリンクに会ったときに何が起こるのか):
ユーティリティ
rm
はシンボリックリンクに沿って階層の他の部分にディレクトリを移動しないでくださいが、リンク自体を削除する必要があります。
次に、後で(理由セクションで):
説明によると、
rm
機能に依存するため、ユーティリティは参照するファイルではなくシンボリックリンク自体を削除します。階層をunlink()
使用-r
または削除するときは、-R
次のシンボリックリンクを明示的に禁止する必要があります。
GNUrm
マニュアルはこれについて何も言わないが、この点でPOSIXに違反しないと仮定しなければならない。他のシステムのマニュアルには、この約束が明示的に含まれています。これはOpenBSDから(FreeBSDとNetBSDは同じ表現を使用します):
この
rm
ユーティリティは、リンクが参照するファイルではなくシンボリックリンクを削除します。
...そしてAIXでは(Solarisにも同様の書き方があります):
ファイルがシンボリックリンクの場合、リンクは削除されますが、シンボリックリンクが参照するファイルまたはディレクトリはそのまま残ります。
rm
シンボリックリンクに関連する動作は、ローカルで簡単にテストできます。
$ touch file
$ ls -l
total 0
-rw-r--r-- 1 myself wheel 0 Feb 26 09:32 file
$ ln -s file link
$ ls -l link
lrwxr-xr-x 1 myself wheel 4 Feb 26 09:32 link -> file
$ rm link
$ ls -l
total 0
-rw-r--r-- 1 myself wheel 0 Feb 26 09:32 file
ディレクトリのシンボリックリンクを使用して同様の練習を実行できます。
答え2
削除プロセスの自信を得る方法は次のとおりです。
ディレクトリ、シンボリックリンク、および一般ファイルを含むテスト設定(例:./Delete_test/)を作成します。
次に、テスト設定にCDを挿入します。
今実行しstrace rm -rf ./* 2> /tmp/strace.rm
て出力をキャプチャします。
/tmp/strace.rm
vim
またはを使用してgrep
fstatやunlinkなどの文字列を見つけた場合、fstatat
などのシステムコールunlinkat
も表示する必要がありますAT_SYMLINK_NOFOLLOW
。AT_FDCWD
これは意味する「シンボリックリンクに従わないでください」そして「CWDを使う」。これは、シンボリックリンクの場合、元のディレクトリとファイルが削除プロセスに参加せず、安全であることを示しています。
いくつかの参考資料:
https://linux.die.net/man/2/unlink
https://linux.die.net/man/2/unlinkat
https://linux.die.net/man/2/fstat
https://linux.die.net/man/2/fstatat