Apakah rm -rf mengikuti tautan simbolik?

72

Saya memiliki direktori seperti ini:

$ 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

Dan saya ingin menghapusnya menggunakan rm -r.

Namun saya takut rm -rakan mengikuti symlink dan menghapus semua yang ada di direktori itu (yang sangat buruk).

Saya tidak dapat menemukan apa pun tentang ini di halaman manual. Apa yang akan menjadi perilaku berjalan rm -rfdari direktori di atas yang ini?

Greg
sumber
16
Seberapa sulit membuat dir boneka dengan symlink yang menunjuk ke file boneka dan menjalankan skenario? Maka Anda akan tahu pasti cara kerjanya!
@LordDoskias Saya pribadi cukup senang bahwa saya dan 46 ribu orang yang telah mengunjungi halaman dapat membaca hasilnya tanpa bereksperimen sendiri. Dan, mereka mungkin menghindari bencana yang buruk dengan membuat percobaan mereka berhasil dan kemudian secara tidak sengaja melakukannya rm -rf somesymlink/, yang merusak dengan jejaknya /. Jika 5% pembaca akan bereksperimen, dan percobaan seperti itu memakan waktu 2,5 menit, itu 5700 menit, atau 95 jam, atau kontribusi $ 6000 untuk masyarakat @ $ 60 / jam. Saya pikir kita semua suka SEBAGAIMANA itu, mari kita semua bertanya dan menjawab pertanyaan bersama: 3
Nicholas Pipitone

Jawaban:

57

Contoh 1: Menghapus direktori yang berisi tautan lunak ke direktori lain.

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$

Jadi, kita melihat bahwa target soft-link bertahan.

Contoh 2: Menghapus tautan lunak ke direktori

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$

Hanya saja, tautan lunak dihapus. Sasaran soft-link bertahan.

Contoh 3: Mencoba menghapus target tautan lunak

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

File di target tautan simbolis tidak bertahan.

Eksperimen di atas dilakukan pada sistem Debian GNU / Linux 9.0 (stretch).

Susam Pal
sumber
12
rm -rf baz / * akan menghapus konten
Wyrmwood
2
Ya, jika Anda melakukan rm -rf [symlink], maka isi dari direktori asli akan dilenyapkan! Berhati-hatilah.
Buttle Butkus
@ frnknstn Anda benar. Saya melihat perilaku yang sama yang Anda sebutkan di sistem Debian terbaru saya. Saya tidak ingat pada versi Debian mana saya melakukan percobaan sebelumnya. Dalam percobaan saya sebelumnya pada versi Debian yang lebih lama, a.txt harus selamat dalam contoh ketiga atau saya harus membuat kesalahan dalam percobaan saya. Saya telah memperbarui jawaban dengan perilaku saat ini yang saya amati di Debian 9 dan perilaku ini konsisten dengan apa yang Anda sebutkan.
Susam Pal
19

Direktori / home / me / msg Anda akan aman jika Anda rm -rf direktori tempat Anda menjalankan ls. Hanya symlink itu sendiri yang akan dihapus, bukan direktori yang ditunjuknya.

Satu-satunya hal yang saya harus waspadai, adalah jika Anda memanggil sesuatu seperti "rm -rf msg /" (dengan trailing slash.) Jangan lakukan itu karena itu akan menghapus direktori yang menunjuk ke msg, daripada symlink msg diri.

Ken Simon
sumber
3
"Satu-satunya hal yang saya harus waspadai adalah jika Anda memanggil sesuatu seperti" rm -rf msg / "(dengan trailing slash.) symlink itu sendiri. " - Saya tidak menemukan ini benar. Lihat contoh ketiga dalam tanggapan saya di bawah ini.
1
Saya mendapatkan hasil yang sama dengan @Susam ('rm -r symlink /' tidak menghapus target symlink), yang saya senangi karena ini akan menjadi kesalahan yang sangat mudah dibuat.
idoimaging
5

rmharus menghapus file dan direktori. Jika file tersebut adalah tautan simbolik, tautan dihapus, bukan target. Itu tidak akan menafsirkan tautan simbolik. Misalnya apa yang seharusnya menjadi perilaku ketika menghapus 'broken links'- rm keluar dengan 0 tidak dengan nol untuk menunjukkan kegagalan

Jayan
sumber