मैं कड़ी कड़ी कैसे हटाऊं?


23

हाल ही में मैंने निम्नलिखित के साथ एक लिंक बनाया:

sudo ln -n originalFileLocation

मैं कड़ी कड़ी कैसे हटाऊं?


4
FYI करें: वर्तमान निर्देशिका में ln -n /path/to/fileएक फ़ाइल fileबनाई गई है और इसके लिए शॉर्टहैंड है ln --no-dereference /path/to/file। इसका मतलब यह है कि यदि /path/to/fileएक प्रतीकात्मक लिंक है, तो नया बनाया गया हार्डलिंक, सिमिलिंक के लक्ष्य के बजाय उस सिम्लिंक को इंगित करेगा।
लेकेनस्टेयेन

जवाबों:


37

आप इसे rmहमेशा की तरह हटा सकते हैं rm NameOfFile:। ध्यान दें कि हार्ड लिंक के साथ "मूल फ़ाइल" और "फ़ाइल का लिंक" के बीच कोई अंतर नहीं है: आपके पास एक ही फ़ाइल के दो नाम हैं, और केवल एक नाम को हटाने से दूसरे को नहीं हटाया जाएगा।


2
इसके अलावा, आपको इसे रूट (उपयोग sudo) के रूप में rm करने की आवश्यकता होगी , यदि आपने इसे प्रदान की कमांड (सुपर-उपयोगकर्ता के रूप में) के साथ बनाया है।
राफेल सीलिएक

3
@ राफेलसिएक: गलत। एक इनोड में सभी हार्ड-लिंक एक ही एक्सेस परमिशन को साझा करते हैं, जो कि इनोड के हैं। हटाने के लिए, यानी "अनलिंक", एक फ़ाइल की निर्देशिका प्रविष्टि जिसे आपको उस फ़ाइल के इनोड पर और उस निर्देशिका में लिखने की अनुमति चाहिए जिसमें वह प्रविष्टि है जिसे आप हटाना चाहते हैं। इसलिए यह अप्रासंगिक है कि हार्ड-लिंक बनाने के लिए किन विशेषाधिकारों का उपयोग किया गया था। वे अभी भी (अभी भी) सृष्टि के समय के समान हो सकते हैं।
डेविड फ़ॉर्स्टर

2

मेरे पास अनावश्यक कड़ी को हटाने के लिए यह स्क्रिप्ट है। लेकिन ध्यान रखना - यह काफी खतरनाक है।

#!/bin/bash
clear
echo Reduce redundant hardlinks in the current folder
echo ------------------------------------------------
echo 
echo "  $(basename $0) [-R]"
echo "      -R means recursive"
echo 
read -p "You can break by pressing Ctrl+C"
echo
ask=1
if [ a$1 == "a-R" ]; then  recursive=" -R "; fi

for i in $(ls -i $recursive | awk '{print $1}' | uniq --repeated | sort); 
do 
    echo "Inode with multiple hardlinked files: $i"
    first=1
    for foundfile in $(find . -xdev -inum $i);
    do 
        if [ $first == 1 ]; then
            echo "  preserving the first file:  $foundfile"
            first=0
        else
            echo "  deleting the redundant file:    $foundfile"  
            #rm $foundfile  
        fi
    done 
    if [ $ask == 1 ]; then 
        read -p "Delete all the rest of redundant hardlinks without asking? y/N "
        if [ a${REPLY,,} == "ay" ]; then  ask=0; fi
    fi  
#   read -p "pause for sure"
    echo
done
echo "All redundant hardlins are removed."
echo

1

वास्तव में rmकाम नहीं करता है:

[user@localhost Products]$ rm AZP/
rm: cannot remove `AZP/': Is a directory
[user@localhost Products]$ rm -r AZP/
rm: cannot remove `AZP': Not a directory

क्या काम करता है unlink AZP


2
क्या आप सुनिश्चित हैं कि आपकी कड़ी कड़ी थी? हार्ड लिंक बिल्कुल फाइलों की तरह हैं Iirc।
सेठ

@ सेठ, वास्तव में मुझे याद नहीं है कि वह क्या था, लेकिन वह नहीं निकालना चाहता जैसा कि आप देख सकते हैं। किसी ने मुझे अनलिंक का उपयोग करने के लिए कहा और यह काम कर गया। :)
बंक

शायद ऐसा इसलिए है क्योंकि AZP एक फ़ाइल थी, निर्देशिका नहीं थी, लेकिन मैं अधिक जानकारी के बिना सुनिश्चित नहीं हो सकता था। Unlink को हमेशा काम करना चाहिए, इसलिए वहाँ कोई समस्या नहीं है।
सेठ

1
AZP/एक निर्देशिका की तरह लग रहा है, आरएम पुनरावर्ती ध्वज के बिना निर्देशिकाओं पर काम नहीं करता है। कोर्यूटिल्स डॉक्स के अनुसार भी। >>> अधिकांश सिस्टम एक निर्देशिका के लिए एक कड़ी बनाने पर रोक लगाते हैं; उन पर जहां इसकी अनुमति है, केवल सुपर-उपयोगकर्ता ही ऐसा कर सकते हैं (और सावधानी के साथ, क्योंकि एक चक्र बनाने से कई अन्य उपयोगिताओं के लिए समस्या पैदा होगी)।
थोरसुमोनर

2
निर्देशिकाओं के हार्ड-लिंक निषिद्ध हैं। यदि AZPएक निर्देशिका (या कुछ और) के लिए एक प्रतीकात्मक लिंक rm AZP/काम नहीं करेगा क्योंकि rmइसकी निर्देशिका ( /अंत के कारण) सोचती है । हालांकि rm AZPठीक काम करेगा। -1
डेविड फोस्टरस्टर

0

यदि आप केवल लिंक को हटाना चाहते हैं और इस प्रकार मूल फ़ाइल रखते हैं, तो आपको अनलिंक का उपयोग करना होगा।


क्या आपने पढ़ा है क्या unlink(1)करता है? यह unlink(2)सिस्टम कॉल के आसपास एक उथला आवरण है , वही सिस्टम कॉल जो rm(1)उन सभी फ़ाइलों के लिए उपयोग करता है जो निर्देशिका नहीं हैं।
डेविड फ़ॉर्स्टर

1
यह उत्तर भ्रामक है। हार्डलिंक वाली फ़ाइलों के साथ "लिंक" और "मूल फ़ाइल" के बीच कोई अंतर नहीं है; सभी हार्डलिंक एक ही फाइल / कंटेंट / इनकोड को दर्शाते हैं, जिसे विभिन्न निर्देशिका प्रविष्टियों द्वारा दर्शाया गया है। unlinkयह नाम के बावजूद, दो अलग-अलग फ़ाइलों में एक हार्डलिंक को अलग नहीं करेगा, लेकिन "अनलिंक" निर्देशिका प्रविष्टि को हटा दें (लेकिन फ़ाइल / सामग्री / इनोड नहीं, जब तक कि लिंक गिनती> 1 है)।
मर्फी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.