AFAIK, नहीं, आप नहीं कर सकते। आपको इसे हटाकर इसे फिर से बनाना होगा। वास्तव में, आप एक सिम्कल को अधिलेखित कर सकते हैं और इस प्रकार इसके द्वारा संदर्भित पथनाम को अद्यतन कर सकते हैं:
$ ln -s .bashrc test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 7 2009-09-23 17:12 test -> .bashrc
$ ln -s .profile test
ln: creating symbolic link `test': File exists
$ ln -s -f .profile test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 8 2009-09-23 17:12 test -> .profile
संपादित करें : जैसा कि ओपी ने एक टिप्पणी में कहा है, --force
विकल्प का उपयोग ln
करने unlink()
से पहले एक सिस्टम कॉल करना होगा symlink()
। नीचे, strace
मेरे लिनक्स बॉक्स पर इसे साबित करने का आउटपुट :
$ strace -o /tmp/output.txt ln -s -f .bash_aliases test
$ grep -C3 ^unlink /tmp/output.txt
lstat64("test", {st_mode=S_IFLNK|0777, st_size=7, ...}) = 0
stat64(".bash_aliases", {st_mode=S_IFREG|0644, st_size=2043, ...}) = 0
symlink(".bash_aliases", "test") = -1 EEXIST (File exists)
unlink("test") = 0
symlink(".bash_aliases", "test") = 0
close(0) = 0
close(1) = 0
इसलिए मुझे लगता है कि अंतिम उत्तर "नहीं" है।
संपादित करें : निम्नलिखित को Arto Bendiken के unix.stackexchange.com, circa 2016 के उत्तर से कॉपी किया गया है ।
यह कर सकते हैं वास्तव में साथ atomically किया जाना rename(2)
है, पहले एक अस्थायी नाम के तहत नए सिमलिंक बनाने और फिर सफाई से एक ही बार में वर्ष सिमलिंक ओवरराइट करके। जैसा कि मैन पेज बताता है:
यदि newpath एक प्रतीकात्मक लिंक को संदर्भित करता है तो लिंक को ओवरराइट कर दिया जाएगा।
शेल में, आप इसे mv -T
निम्नानुसार करेंगे:
$ mkdir a b
$ ln -s a z
$ ln -s b z.new
$ mv -T z.new z
आप strace
यह सुनिश्चित कर सकते हैं कि यह वास्तव rename(2)
में हुड के नीचे उपयोग कर रहा है:
$ strace mv -T z.new z
lstat64("z.new", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
lstat64("z", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
rename("z.new", "z") = 0
नोट ऊपर में है कि, दोनों mv -T
और strace
कर रहे हैं लिनक्स विशिष्ट।
FreeBSD पर, mv -h
वैकल्पिक रूप से उपयोग करें ।
संपादक का ध्यान दें: यह कैसे Capistrano ने वर्षों के लिए किया है, अब ~ 2.15 के बाद से। यह पुल अनुरोध देखें ।
ln
पुराने लिंक को अधिलेखित करने के लिए केवल कमांड (या एपीआई समतुल्य) क्यों नहीं जारी किया जाता है ? आपकी क्या समस्या हैं?