मैं सबसे अधिक अनुसरण कैसे कर सकता हूं, लेकिन सभी, प्रतीकात्मक लिंक नहीं?


10

मेरा OS और होम डायरेक्टरी एक SSD पर है। मैं एक हार्ड डिस्क पर कुछ बड़ी फ़ाइलों को संग्रहीत करता हूं, और अपने होम डायरेक्टरी से हार्ड डिस्क (जैसे। ~ / वीडियो / फिल्म्स / सीमांत / hdd / फिल्म्स) के लिए सिमलिंक करता हूं। मेरे पास बहुत से वाइन उपसर्ग हैं, जिनमें से प्रत्येक में डॉसदेविस / z है: / के लिए सहानुभूति है।

इसलिए, अगर मैंने बिना -L का उपयोग किया है, तो यह सब कुछ याद करेगा जो हार्ड डिस्क पर है। लेकिन अगर मैं -L के साथ खोज का उपयोग करता हूं, तो यह वाइन के सिम्लिंक टू / के कारण लूप में समाप्त हो जाता है।

क्या इसे हल करने का कोई समझदार तरीका है, ताकि वह खोजें जहां मैं चाहता हूं? सहज रूप से, मैं "सिम्बलिंक का पालन करना" की तर्ज पर कुछ चाह रहा हूं, जब तक कि वे डॉसदेवडीस नामक एक निर्देशिका के अधीन न हों। "हार्ड डिस्क पर कुछ करने के लिए सिम्बलिंक का पालन करें" भी काम करेगा।

जवाबों:


11

-pruneप्राथमिक बताता है findएक निर्देशिका के अंतर्गत recurse करने के लिए नहीं।

find -L -path ~/.wine/dosdevices -prune -o -type f -name 'My Favorite Movie.*' -print

यदि आप -lnameअपनी स्थिति में उपयोग करना चाहते हैं, तो आप -Lविकल्प का उपयोग नहीं कर सकते , क्योंकि -Lलिंक के लक्ष्य पर कार्य करने के लिए सबसे अधिक विधेय का कारण बनता है -lname। उस मामले में मेरी सिफारिश आपकी खोज के मूल के रूप में आपके होम डायरेक्टरी और हार्ड डिस्क रूट दोनों का उपयोग करने के लिए होगी।

find ~ /mnt/hdd -xtype f -name 'My Favorite Movie.*'

आप find ~ -type l …प्रतीकात्मक लिंक की एक सूची इकट्ठा करने और उन्हें अतिरिक्त जड़ों के रूप में उपयोग करने के लिए दौड़ सकते हैं।

( IFS=$'\n'; set -f;
  find ~ $(find ~ -type l -lname '/mnt/hdd/*') \
       -xtype f -name 'My Favorite Movie.*' )

यदि आप वास्तव में प्रतीकात्मक लिंक के तहत पुनरावृत्ति करना चाहते हैं, तो आप नाम के बजाय लक्ष्य द्वारा विशिष्ट प्रतीकात्मक लिंक को बाहर कर सकते हैं। हालाँकि आप केवल एक सीमित सूची को बाहर कर सकते हैं, न कि इस तरह से एक पैटर्न या सबट्री।

find -L \( -samefile /exclude/this -o -samefile ~/and/that \) -prune -o \
     -type f -name 'My Favorite Movie.*' -print

आप अन्य मानदंडों का उपयोग कर सकते हैं जैसे ! -writable(वे फाइलें जिनके बारे में आपको अनुमति नहीं है), लेकिन मुझे नहीं लगता कि जीएनयू को केवल प्रतीकात्मक लिंक के तहत पुनरावृत्ति करने का एक तरीका है अगर उनका लक्ष्य पाठ एक निश्चित अभिव्यक्ति से मेल खाता है।

आप एक ऐसी findकमांड का निर्माण कर सकते हैं जो आपको पर्याप्त प्रतीकात्मक लिंक को छोड़कर नहीं के अलावा लगभग क्या चाहिए, क्वेरी को एक पर्ल स्क्रिप्ट में बदलने के लिए find2perl चलाती है, और पर्ल स्क्रिप्ट को थोड़ा मोड़ देती है। GNU के कई स्विच हैं जो पाते हैं कि find2perl पहचान नहीं पाता है, हालाँकि।


धन्यवाद! -pruneबस जिस तरह की चीज मैं देख रहा था। मैंने पाया है कि find ~ \( -lname ~ -o -lname ~/\* -o -lname / \) -xtype dउन सभी सिम्बलिंक को सूचीबद्ध करता है जिनका मैं पालन नहीं करना चाहता; अब मैं उस क्वेरी का उपयोग करने का एक तरीका ढूंढने की कोशिश कर रहा हूं।
मार्क रेमंड

@MarkRaymond सामान्य सिद्धांत है find ~ <negative criteria> -prune -o <positive criteria> -print, इसलिएfind ~ \( -lname ~ -o -lname ~/\* -o -lname / \) -xtype d -prune -o <whatever it is you want> -print
गाइल्स का SO-

@ गिल्स - जो बिना -L के ठीक काम करता है, लेकिन एक बार जब मैं ऐड -L करता हूं, तो -lname एक्सप्रेशन कोई और काम नहीं करता (जैसा कि मैन पेज कहता है कि वे नहीं करेंगे)। इसलिए मूल रूप से मुझे कुछ शर्तों की आवश्यकता है ताकि सहानुभूति और दूसरों को पालन न करें!
मार्क रेमंड

मैं वैसा करने के तरीके के बारे में नहीं सोच सकता जैसा आप चाहते हैं। कुछ सन्निकटन के लिए मेरा संपादन देखें।
गाइल्स 'एसओ- बुराई को रोकना'

1

सभी लिंक खोजने के लिए, इसने मेरे लिए काम किया:

find -L . -name \*.txt

0

आपके पास हार्ड डिस्क के कितने सिम्बल हैं? यदि यह बहुत अधिक नहीं है, तो एक ही समाधान "-L" का उपयोग नहीं करना है, जबकि आप स्पष्ट रूप से उन आज्ञाओं को निर्दिष्ट करते हैं जो आप खोज कमांड लाइन पर अनुसरण करना चाहते हैं। कुछ इस तरह:

find .  ~/Videos/Films -name '*file I want*' ...

यह वर्तमान निर्देशिका ("।") के साथ-साथ सिमिलिंक "~ / वीडियो / फिल्म्स" को खोजेगा, लेकिन अन्य सिम्कलिंक्स में नहीं उतरेगा।


0

एक और समाधान जो समस्या को साइड-स्टेप करता है (कम से कम मेरे मामले के लिए) हार्ड डिस्क पर निर्देशिकाओं के लिए प्रतीकात्मक लिंक के बजाय बाइंड माउंट का उपयोग करना है। यह /etc/fstabइस तरह से प्रविष्टियों को जोड़कर किया जाता है :

/mnt/hdd/Films /home/mark/Videos/Films none bind 0 0

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