Idealnya saya ingin perintah seperti ini
rm --only-if-symlink link-to-file
karena saya telah membakar diri saya berkali-kali secara tidak sengaja menghapus file bukannya symlink yang menunjuk ke file. Ini bisa sangat buruk ketika sudo terlibat. Sekarang saya tentu saja melakukan ls -al
untuk memastikan itu benar-benar symlink dan semacamnya tetapi itu rentan terhadap kesalahan operator (sama-sama bernama file, kesalahan ketik, dll) dan kondisi balapan (jika seseorang ingin saya menghapus file karena suatu alasan). Apakah ada cara untuk memeriksa apakah suatu file adalah symlink dan hanya menghapusnya jika ada dalam satu perintah?
bash
command-line
rm
Shelvacu
sumber
sumber
Jawaban:
sumber
!
dan mengubah||
ke&&
||
formulir.&&
membawa segalanya jika Anda dalamset -e
mode.[ ! -L $1 ]
), menggunakan operator yang tidak valid ([ ! -l foo ]
), atau bahkan kesalahan sintaksis ([ ! -q foo || echo foo
)rm_if_link(){ [ -L "$1" ] && rm -v "$1"; }
adalah menjalankannya padaset -e
mode nonlink akan mematikan proses shell Anda. Anda bisa menambahkan|| :
tetapi kemudian menjadi, IMHO, bahkan lebih tidak jelas daripada! ||
versi, dan itu akan mencegahrm
kegagalan membunuh Andaset -e
, yang kemungkinan tidak diinginkan.! ||
cukup ringkas dan jelas, dan tidak menderita salah satu dari masalah ini.rm
dalam tes Anda, b) gunakan pernyataan if aktual, c) jangan berkeliling menggunakan-e
shell interaktif (dan uji skrip Anda!). Jika Anda ingin memperdebatkan tentang keterbacaan, gunakanif
untuk menguji apakah ada tautan yang merupakan pemenangnya.Anda dapat menggunakan
find
dan-type l
kondisi pengujiannya (yang menguji untuk melihat apakah objek yang ditemukan adalah tinta l atau tidak)Misalnya, jika Anda memiliki file yang dipanggil
foo
di direktori saat ini, Anda bisa melakukan ini:Anda mungkin dapat menyederhanakannya hanya dengan:
Yang akan menghapus semua symlink di direktori saat ini.
Peringatan:
The
-delete
pilihan difind
benar-benar benar-benar berbahaya. PASTIKAN UNTUK MENEMPATKANNYA DI AKHIR FIND COMMAND Jika Anda salah menaruhnya, itu akan menghapus semua yang ditemukan terlepas dari apakah hasilnya cocok dengan kondisi Anda.Seperti yang disarankan dalam komentar, opsi yang lebih aman adalah menggunakan
find
danrm -i
(yang memaksa Anda mengonfirmasi penghapusan file) bersamaan:Secara pribadi saya gunakan
-exec trash {} \;
untuk menghapus file sementara, karena saya, seperti Anda sendiri, telah dibakarrm
sebelumnya. Double berlaku untuk-delete
bendera yang salah tempat .http://slackermedia.ml/trashy
sumber
find . -type l -iname "foo" | xargs rm -i
lebih aman.rm -i
Untuk keamanan, pasti.-print0
untukfind
dan-0
untukxargs
.@
adalah kualifikasi glob ; polanyafoo(@)
cocok dengan yangfoo
cocok, tetapi hanya tautan simbolik.foo(-@)
hanya akan cocok dengan tautan simbolis yang rusak.foo(@,L0)
hanya akan cocok dengan tautan simbolis dan file kosong.Tentu saja, jika Anda menjalankan zsh di tempat pertama, Anda hanya perlu mengetik
rm foo(@)
. Anda harus berhati-hati untuk tidak menekan Entersebelum mengetik(@)
.sumber