Hapus symlink ke direktori

1085

Saya memiliki symlink ke direktori penting. Saya ingin menyingkirkan symlink itu, sambil menjaga direktori di belakangnya.

Saya mencoba rmdan kembali rm: cannot remove 'foo'.
Saya mencoba rmdirdan kembali rmdir: failed to remove 'foo': Directory not empty
saya kemudian berkembang rm -f, rm -rfdansudo rm -rf

Kemudian saya pergi mencari back-up saya.

Apakah ada cara untuk menghilangkan symlink dengan membuang bayi dengan air mandi?

Matthew Scouten
sumber
74
apa yang salah dengan mengajukan pertanyaan terkait linux? Terakhir kali saya memeriksa, stack overflow tidak spesifik untuk os
Jeremy Cantrell
6
Bukankah pertanyaan ini lebih cocok untuk Pengguna Super, atau Stack Exchange terkait Linux?
mwfearnley
45
@ mwfearnley Ya, tapi periksa tanggalnya. Super User bukanlah sesuatu saat itu. Sudah porting, jadi juga ada di sana. Tidak yakin mengapa itu masih di sini, tapi itu adalah pertanyaan skor tertinggi saya dan saya tidak akan melihat karma hadiah di mulut.
Matthew Scouten
16
TIP: rm -r link/ menghapus konten pada target
Gayan Weerakutti
31
Then I went to find my back-ups- Itu membuatku tertawa.
frakman1

Jawaban:

1308
# this works:
rm foo
# versus this, which doesn't:
rm foo/

Pada dasarnya, Anda perlu mengatakannya untuk menghapus file , bukan menghapus direktori . Saya percaya perbedaan antara rmdan rmdirada karena perbedaan dalam cara perpustakaan C memperlakukan masing-masing.

Bagaimanapun, yang pertama harus bekerja, sedangkan yang kedua harus mengeluh tentang foo menjadi direktori.

Jika tidak berfungsi seperti di atas, maka periksa izin Anda. Anda perlu izin tertulis ke direktori yang berisi untuk menghapus file.

Matthew Scharley
sumber
121
ah iya. itu masuk akal. Saya tidak pernah mengetik foo, saya mengetik f <tab> dan bash mengisi / untuk saya.
Matthew Scouten
6
Ini tidak selalu berhasil. Kadang-kadang Anda perlu menjalankan rm -rf folderName(tanpa trailing /) untuk menghapus symlink. Amazon Linux berlaku seperti ini dalam keadaan tertentu, misalnya.
naskah merek
18
@ r3mus: Jangan pernah gunakan -rdengan symlink kecuali Anda ingin kehilangan semua yang ada di dalamnya. -fjuga tidak diperlukan, kecuali mungkin untuk mengganti izin file.
Matthew Scharley
27
Secara khusus, unlinktidak ada hubungannya dengan lnoperasi 'tautan' AKA. Nama ini unlinkmengacu pada proses pembatalan tautan / penghapusan file dari tabel file sistem file sehingga konten menjadi terlepas dari referensi apa pun kepada mereka - mereka tidak terhubung. Itu nama yang membingungkan yang benar-benar menyesatkan ketika diterapkan pada tautan dan symlink pada khususnya. unlinkakan bekerja dengan symlink karena berfungsi dengan file apa pun apa pun jenisnya.
Matthew Scharley
4
Jika Anda pernah benar-benar khawatir melakukan sesuatu yang konyol, alias rm="rm -i"telah menyelamatkan lebih banyak kulit daripada hal lain di luar sana yang saya pikir.
Matthew Scharley
832

gunakan perintah "unlink" dan pastikan untuk tidak memiliki / pada akhirnya

$ unlink mySymLink

batalkan tautan () menghapus nama dari sistem file. Jika nama itu adalah tautan terakhir ke sebuah file dan tidak ada proses yang membuka file itu, file itu dihapus dan ruang yang digunakan disediakan untuk digunakan kembali. Jika nama itu merupakan tautan terakhir ke suatu file tetapi proses apa pun masih membuka file tersebut, file tersebut akan tetap ada hingga deskriptor file terakhir yang merujuk padanya ditutup.

Saya pikir ini mungkin bermasalah jika saya membacanya dengan benar.

Jika nama tersebut merujuk pada tautan simbolik, tautan tersebut dihapus.

Jika nama merujuk ke soket, fifo atau perangkat, nama untuk itu dihapus tetapi proses yang memiliki objek terbuka dapat terus menggunakannya.

https://linux.die.net/man/2/unlink

Joe Phillips
sumber
33
@OmarAbid Versi "rm foo /" membuatku takut. Yang ini sepertinya jauh lebih aman :)
Joe Phillips
9
Di Ubuntu, saya diuji dengan ~/c/a/file, /c/b/, dengan ln -s ~/c/a ~/c/b/. Dalam ~/c/b/, rm a/tidak berfungsi, rm -rf a/hanya mengosongkan aslinya a. unlink abekerja dengan sempurna, dan unlink a/tidak melakukan apa pun.
Brady Trainor
3
Di OS X 10.10, unlinkhanyalah sebuah alias untuk rm. Pergi untuk menunjukkan bahwa rmdisiplin yang tepat harus digunakan ketika berurusan dengan bagian mana pun dari struktur direktori Anda.
Doug Powers
1
Dalam skrip rm -fakan diam-diam menghapus tautan apakah itu ada atau tidak, sedangkan unlinkakan mengeluh jika tautan itu tidak ada. Tidak ada opsi `-f 'yang setara untuk memutuskan tautan, membuat skrip menjadi lebih kompleks.
pengguna linux shonky
22
unlinkdapat menghapus file biasa. itu kurang fitur daripada rmdan tidak khusus untuk symlink. rmjuga tidak menghapus direktori tanpa -rbendera. Jadi saya sarankan lebih suka rm, ia memiliki flag untuk verbose dan interaktif; serta pesan peringatan dan kesalahan yang bermakna.
ThorSummoner
18

rm harus menghapus tautan simbolik.

skrall@skrall-desktop:~$ mkdir bar
skrall@skrall-desktop:~$ ln -s bar foo
skrall@skrall-desktop:~$ ls -l foo
lrwxrwxrwx 1 skrall skrall 3 2008-10-16 16:22 foo -> bar
skrall@skrall-desktop:~$ rm foo
skrall@skrall-desktop:~$ ls -l foo
ls: cannot access foo: No such file or directory
skrall@skrall-desktop:~$ ls -l bar
total 0
skrall@skrall-desktop:~$ 
Steve K.
sumber
17

Gunakan rm symlinknametetapi tidak termasuk garis miring di akhir (jangan gunakan rm symlinkname/:). Anda kemudian akan ditanya apakah Anda ingin menghapus symlink, yuntuk menjawab ya.

DeeEss09
sumber
63
Anda tidak salah, tetapi jawaban yang tepat sudah ada di sini dan diterima (4 tahun yang lalu!). Kenapa mengganggu?
Matthew Scouten
1
Google menjadikan ini sebagai cuplikan unggulan ketika mencari "Hapus symlink". Mungkin itu menyukai singkatnya, tidak yakin bagaimana heuristiknya bekerja. Lagi pula, saya segera melakukan facepalm ketika saya melihat kembali pada baris perintah saya :-)
Randall
12

Dengan asumsi itu sebenarnya adalah symlink,

$ rm -d symlink

Seharusnya mengetahuinya, tetapi karena kita tidak dapat mengaktifkan kode laten yang dimaksudkan untuk kasus lain yang tidak lagi ada tetapi terjadi untuk melakukan hal yang benar di sini.

Joshua
sumber
7

Jika rm tidak dapat menghapus symlink, mungkin Anda perlu melihat izin pada direktori yang berisi symlink. Untuk menghapus entri direktori, Anda harus menulis izin pada direktori yang berisi.

Greg Hewgill
sumber
4

Dengan asumsi pengaturan Anda adalah sesuatu seperti:, ln -s /mnt/bar ~/foomaka Anda harus dapat melakukan rm footanpa masalah. Jika Anda tidak bisa, pastikan Anda adalah pemilik foodan memiliki izin untuk menulis / mengeksekusi file. Menghapus footidak akan menyentuh bar, kecuali jika Anda melakukannya secara rekursif.

TJ L
sumber
2

Di CentOS, jalankan saja rm linknamedan itu akan meminta untuk "menghapus tautan simbolik?". Ketik Ydan Enter, tautannya akan hilang dan direktori aman.

Yuri
sumber
2

Saya punya masalah dengan MinGW (sebenarnya Git Bash) yang berjalan di Windows Server. Tidak ada saran di atas yang berhasil. Pada akhirnya salinan direktori dibuat dalam kasus kemudian menghapus tautan lunak di Windows Explorer kemudian menghapus item di Recycle Bin. Itu membuat suara seperti menghapus file tetapi tidak. Namun, lakukan backup!

Keith Whittingham
sumber
3
"Itu membuat suara seperti menghapus file ..." - Wow!
Sterex
LMFAO. "Itu membuat suara seperti menghapus file ..."
Shivam Jha
Saya ingat floppy disk!
Keith Whittingham
Tidak ada satu pun di atas yang berfungsi untuk saya: eddyq @ eddyq-Latitude-E6440: ~ $ ls Unduhan Desktop Dropbox-Windows Music Public Videos dengan Dokumen Dropbox
contoh.desktop