निर्देशिका में सभी फ़ाइलों (फ़ाइलों का वर्ग) के लिए प्रतीकात्मक लिंक कैसे बनाएं?


43

मैं एक निश्चित निर्देशिका में ln -sसभी फाइलों (या फाइलों के एक वर्ग, जैसे समाप्त होने के .bar) के लिए प्रतीकात्मक लिंक ( ) बनाना चाहूंगा । कहो कि मैं cwd में हूं और टाइप ls ../source/*.barमुझे देता है

foo.bar
baz.bar

मैं पैरामीटर सूची कैसे पास कर सकता हूं ln -sकि यह आखिरकार हल हो जाती है

ln -s ../source/foo.bar
ln -s ../source/baz.bar

निश्चित रूप से मुझे पता है कि मैं बैश स्क्रिप्ट लिख सकता हूं, लेकिन इसमें कुछ सरल शामिल होना चाहिए, xargsक्योंकि यह एक सामान्य कार्य लगता है - कम से कम मेरे लिए।

जवाबों:


75

ln कई तर्क देता है, लेकिन उस मामले में एक लक्ष्य निर्देशिका देने के लिए मत भूलना।

तो, आपके उदाहरण .में लक्ष्य निर्देशिका है, इसलिए यह उतना आसान होना चाहिए जितना कि

ln -s ../source/*.bar .

से man ln; ऊपर दिए गए आदेश का तीसरा रूप उपयोग करता है:

ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
ln [OPTION]... TARGET                  (2nd form)
ln [OPTION]... TARGET... DIRECTORY     (3rd form)
ln [OPTION]... -t DIRECTORY TARGET...  (4th form)
  • 1 फॉर्म में, TARGET का लिंक LINK_NAME नाम से बनाएं।
  • 2 डी फॉर्म में, TARGET के लिंक को वर्तमान डायरेक्टरी में बनाएं।
  • 3rd और 4th फॉर्म में, DIRECTORY में प्रत्येक TARGET के लिंक बनाएं।

5
आपने मुझे अपने जीवन के 5 ठोस मिनट बचाए, उनमें से एक टिप्पणी छोड़ने के लिए पर्याप्त खर्च किया। :-)
मूडबोम

अगर कोई फाइल नहीं है तो यह काम नहीं करता है *.bar। यह नाम के साथ एक लिंक बनाएगा "*.bar", जो आप नहीं चाहते हैं।
निमरोड

1
@Nimrod: यह सच है, लेकिन आप बता सकते हैं bash है कि आप इसे माध्यम के बजाय एक त्रुटि रिपोर्ट करना चाहते हैं shopt -s failglob; उदाहरण के लिए देखें unix.stackexchange.com/a/216227/33390 ( zsh में समतुल्य है setopt nomatch, जो डिफ़ॉल्ट रूप से चालू है)
mpy

: ताली: अच्छा!
क्रिस शमित्ज़

3

उपयोग find

certainDir="/path/to/dir"
find -name "*.bar" -exec ln -s {} "$certainDir" \;

इसके अलावा, सहानुभूति के साथ पूर्ण पथ (जहां संभव हो) का उपयोग करना याद रखें ।


2
धन्यवाद, लेकिन यह नहीं है find $certainDir -name "*.bar" -exec ln -s {} \;? और मुझे पूर्ण पथों का उपयोग क्यों करना चाहिए? मुझे यह जानना काफी सुविधाजनक लगता है कि जब मैं डायरेक्टरी ट्री को हिलाता हूं, तो कुछ आंतरिक लिंक होते हैं, तो लिंक बरकरार रहते हैं।
dastrobu

यह निर्भर करता है कि आप निर्देशिकाओं को कहाँ से जोड़ना चाहते हैं। और मुझे याद नहीं है कि पूर्ण पथ एक अच्छा विचार क्यों है, यह कठिन लिंक के लिए हो सकता है, लेकिन मैंने एक कारण के लिए मेरे दिमाग में जला दिया। हममम।
भयावह

धन्यवाद, आपका जवाब बहुत अच्छा है। चूँकि mpy का उत्तर प्रश्न का सरल उपाय है, इसलिए बिंदु उसके पास जाता है। मैं दोनों उत्तर स्वीकार करता, अगर मैं कर सकता था।
dastrobu

3

आप ग्लोबस्टार (बैश / zsh द्वारा सेट:) का उपयोग करके या तो पुनरावर्ती प्रयास कर सकते हैं shopt -s globstar:

ls -vs ../**/*.bar .

नोट: -vक्रिया के लिए जोड़ा गया ।

या यदि सूची बहुत लंबी है, तो findउपयोगिता का उपयोग करते हुए :

find .. -name \*.bar -exec ln -vs "{}" dest/ ';'

यह वर्तमान फ़ोल्डर के लिए dest/इसमें लिंक बनाएगा , या इसे बदलेगा .


दूसरा सही उत्तर है।
निमरॉड

0

cp-sविकल्प के साथ एक नरम लिंक (या -lहार्ड लिंक के लिए) बना सकते हैं ।

वर्तमान निर्देशिका से इस तरह इस्तेमाल किया जा सकता है:

$ cp -s ../path/with/scripts/* .

आपके मामले में यह इस तरह होगा:

$ cp -s ../source/*.bar .
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.