Bagaimana cara menghapus target tautan simbolik tanpa menghapus tautan itu sendiri?

10

Saya memiliki tautan simbolis ~/Desktop/test.txtyang menunjuk ke ~/rendu/test.txt.

Saya HANYA mengetahui jalur ~/Desktop/test.txt, saya ingin cara cepat untuk menghapus ~/rendu/test.txtTANPA menghapus tautan simbolis.

Untuk yang ingin tahu alasannya: Saya memiliki file bernama crypted.xxxdi desktop saya, yang dienkripsi dan berisi kata sandi saya.

Ketika saya ingin memperbarui file terenkripsi saya, saya mendekripsi dan membuatnya crypted.txtdi direktori khusus. Jadi saya membuat tautan ke file itu di desktop saya untuk alasan praktis. Tetapi setelah melihat saya crypted.txt, saya ingin menghapus ini dengan cepat crypted.txt(tetapi bukan tautan di desktop).

Ugo Hed
sumber
4
tunggu, Anda ingin menghapus file (seperti pertanyaan Anda) atau menghapus konten file (sebagai judul sais)
Jacob Vlijm
Hapus file dan simpan tautan simbolisnya, maaf atas kesalahpahaman
Ugo Hed
2
Mungkin Anda bisa mempertimbangkan menggunakan pengelola kata sandi khusus? Keepass cukup bagus, misalnya, dan ada di dalam repo.
evilsoup

Jawaban:

11

gunakan finduntuk menemukan symlink dan kemudian gunakan readlinkuntuk mendapatkan path lengkap ke target ke rm:

find ~/Desktop/ -type l -name 'test.txt' -exec bash -c 'rm "$(readlink -f "$1")"' _ {} \;

Atau seperti yang Anda ketahui nama tautannya:

rm "$(readlink -f ~/Desktop/test.txt)"
heemayl
sumber
4
Hati-hati dengan tautan relatif. Tautan simbolis relatif ditafsirkan sebagai relatif terhadap direktori tempat ia berada. Tetapi rmperintah Anda akan menafsirkannya relatif terhadap direktori shell saat ini. Oleh karena itu ada kemungkinan untuk perintah itu untuk menghapus file yang berbeda dari apa yang ditunjukkan oleh tautan simbolik.
kasperd
5
@kasperd With -f -eatau -mpath lengkap dikembalikan, bahkan jika target symlink menunjuk ke path relatif, jadi ya, itu adalah masalah jika rm "$(readlink ~/Desktop/test.txt)", tetapi tidak ketika menggunakan -f -eatau -m.
kos
@kos Anda benar. Dalam hal ini Anda hanya perlu khawatir jika ada kondisi balapan.
kasperd
Atau, seseorang dapat menggunakan realpath , yang dalam hal ini melakukan hal yang sama readlink -f(tetapi juga berfungsi jika target itu sendiri bukan tautan).
leftaroundabout
6

Cukup gunakan:

printf "" > "$(readlink '/path/to/link')"

untuk menghapus file, atau

rm "$(readlink '/path/to/link')"

untuk menghapus file.

Yakub Vlijm
sumber