मैं एक विशेष लक्ष्य के साथ सभी प्रतीकात्मक लिंक कैसे हटा सकता हूं?


43

कमांड के साथ:

ls -la *

मैं अपने सभी प्रतीकात्मक लिंक सूचीबद्ध कर सकता हूं।

मैं सभी प्रतीकात्मक लिंक कैसे हटा सकता हूं जो एक विशेष फ़ोल्डर से जुड़े हैं?

उदाहरण के लिए:

मेरी निर्देशिका में मेरी usr/local/binनिम्नलिखित प्रविष्टियाँ हैं:

lrwxrwxrwx 1 root root 50 Apr 22 14:52 allneeded -> /usr/local/texlive/2011/bin/x86_64-linux/allneeded
lrwxrwxrwx 1 root root 47 Apr 22 14:52 amstex -> /usr/local/texlive/2011/bin/x86_64-linux/amstex
lrwxrwxrwx 1 root root 24 Apr 23 19:09 arara -> /home/marco/.arara/arara

अब मैं रास्ते से सभी लिंक को हटाना चाहता हूं /usr/local/texlive/


1
क्या आपका मतलब टारगेट फोल्डर से जुड़े सभी सिमलाइन को हटाना है? या सभी पाए गए सिमिलिंक को एक विशिष्ट फ़ोल्डर में स्थानांतरित करें?
जॉर्ज एम

@uther: मेरा मतलब है लिंक हटाना।
मार्को डैनियल

जवाबों:


63

कृपया वैकल्पिक उत्तर को पढ़ना सुनिश्चित करें । यह इस बिंदु पर और भी अधिक है, हालांकि इस बिंदु पर उच्च मतदान नहीं किया गया है।

आप सभी प्रतीकात्मक लिंक को हटाने के लिए इसका उपयोग कर सकते हैं:

find -type l -delete

आधुनिक findसंस्करणों के साथ ।

पुराने खोज संस्करणों पर यह हो सकता है:

find -type l -exec rm {} \;
# or
find -type l -exec unlink {} \;

एक निश्चित लिंक लक्ष्य को सीमित करने के लिए, किसी भी पथ को मानने से कोई भी नया वर्ण नहीं होता है:

 find -type l | while IFS= read -r lnkname; do if [ "$(readlink '$lnkname')" == "/your/exact/path" ]; then rm -- "$lnkname"; fi; done

या अच्छी तरह से स्वरूपित

 find -type l |
 while IFS= read -r lnkname;
 do
   if [ "$(readlink '$lnkname')" = "/your/exact/path" ];
   then
     rm -- "$lnkname"
   fi
 done

ifनिश्चित रूप से भी इस तरह के साथ एक पैटर्न मिलान के रूप में एक अधिक जटिल हालत शामिल हो सकते हैं grep


आपके मामले में दर्जी:

find -type l | while IFS= read -r lnk; do if (readlink "$lnk" | grep -q '^/usr/local/texlive/'); then rm "$lnk"; fi; done

या अच्छी तरह से स्वरूपित:

find -type l | while IFS= read -r lnk
do
  if readlink "$lnk" | grep -q '^/usr/local/texlive/'
  then
    rm "$lnk"
  fi
done

क्या यह आदेश सभी सहानुभूति को हटा देता है? कृपया ऊपर मेरा संपादन देखें ..
मार्को डैनियल

@ मार्को: हाँ, पहली तीन लाइनें होंगी। संपादन अधिक :)
0xC0000022L

मैं कुछ दृश्य प्रतिक्रिया पाने -printके लिए findकमांड के अंत में भी जोड़ूंगा।
रनलेवेल0

30

एक आधुनिक के साथ findजो समर्थन करता है -lname:

find /usr/local/bin -lname '/usr/local/texlive/*' -delete

करना चाहिए।


1
यह एक महान और सरल उपाय है। मैंने परीक्षण किया और यह एक आकर्षण की तरह काम करता है। साभार
मार्को डैनियल

संभवत: ऐसा होना चाहिएfind /usr/local/bin
जेम्स यंगमैन

1
जरूरी नहीं कि आधुनिक भी हो। जीएनयू findने इसे -lnameलंबे समय तक बनाए रखा है, जबकि मैंने इसे बनाए रखा है (2003 के बाद से)।
जेम्स यंगमैन

@JamesYoungman: धन्यवाद! आधुनिक रूप से findमेरा वास्तव में जीएनयू से मतलब था find। ;) मैंने इस्तेमाल किया usr/local/bin, क्योंकि यही ओपी इस्तेमाल करता था।
क्रिस्टोफ़र हैमरस्ट्रॉम

5

findसमाधान महान है।

बस अगर आपका खोज समर्थन नहीं करता है -lname, तो यहां एक और तरीका है जो केवल शेल का उपयोग करता है और readlink

cd /usr/local/bin
for f in *; do
  case "$(readlink "$f")" in /usr/local/texlive/*)
    rm "$f"
    ;;
  esac
done

1

के साथ zsh:

rm -f /usr/local/bin(@e'{[[ $REPLY:P = /usr/local/texlive/* ]]}')

$REPLY:Pपूरी तरह से, एक सिमलिंक से मुक्त एक के लिए पथ का समाधान करता है तो यह सोचते हैं /usr/local/texliveही मुक्त कर सिमलिंक, यह सभी फाइलों को जो सिमलिंक संकल्प को लाइव के तहत के बाद हटा है /usr/local/textliveजो करने के लिए लिंक को शामिल किया जाएगा /usr/local/texlive/foo, लेकिन यह भी करने के लिए ../texlive/barया करने के लिए /usr/./local/texlive/whateverया करने के लिए /some/other/symlinkजो अपने आप में एक सिमलिंक में ओर इशारा करते हुए है /usr/local/texlive, आदि ।


0

अपने पथ पर जाएँ और अपने आप को पथ कॉन्फ़िगरेशन सेट करें

ls -alh|grep "your-pattern-to-file-or-folder-for-symlink"| awk '{print $9}'|xargs rm -rf

चूंकि ये रास्ते हैं जैसे usr/local/binकि grepखोज रहा है, grep -Eजाने का रास्ता है। अन्यथा कोई मिलान परिणाम नहीं होगा। इसके अलावा hमें lsकिसी भी उद्देश्य के लिए यहाँ की सेवा नहीं है! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G)। अधिक देखने के लिए man lsयाman grep
ss_iwe
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.