लिनक्स कमांड में "{} \" का क्या अर्थ है?


37

कभी-कभी मुझे निम्नलिखित कमांड दिखाई देती है:

find . -name  * -exec ls -a {} \;

मुझे इसे निष्पादित करने के लिए कहा गया था।

{} \;यहाँ क्या मतलब है?


1
-name *बेमानी है।
केविन

3
इस तरह के अन्य प्रकार के प्रश्नों के लिए स्पष्टीकरण भी देखें । यहां आपकी कमांड के लिए आउटपुट है।
21

8
-name *बेमानी से भी बदतर है। क्योंकि *अयोग्य है, शेल मौजूदा फ़ोल्डर में फ़ाइल नामों की सूची में फैलता है, जिसमें रिक्त स्थान गलत तरीके से व्यवहार किया जाता है, जिससे अप्रत्याशित परिणाम या एक त्रुटि संदेश जाता है। एक अतिरिक्त बिंदु के रूप में, findकई कार्य हैं, उनमें से एक फाइलों की सूची बनाना है; यह उपयोग करने से बचा जाता है -exec। जैसे, आप उपयोग कर सकते हैं find . -printया find . -ls। या तो आप बैकस्लैश के साथ किया था के रूप में, अंत में, वहाँ सेमी-कोलन से बचने के लिए दो तरीके हैं \;, या उद्धृत करके: ';'। आप जिसके साथ अधिक सहज महसूस करते हैं, उसका उपयोग करें।
धान लैंडौ

जवाबों:


48

यदि आप findसाथ चलते हैं exec, तो {}प्रत्येक फ़ाइल या निर्देशिका के फ़ाइलनाम का विस्तार करते हैं find(ताकि lsआपके उदाहरण में प्रत्येक फ़ाइल नाम को तर्क के रूप में मिल जाए - ध्यान दें कि यह कॉल lsया जो भी अन्य कमांड आपको प्रत्येक फ़ाइल के लिए एक बार निर्दिष्ट करता है)।

अर्धविराम ;द्वारा निष्पादित आदेश को समाप्त करता है exec। इसे लेकर भागने की जरूरत है \ताकि आपके findअंदर चलाए जाने वाले खोल इसे अपना विशेष चरित्र न मानें, बल्कि इसे पास कर दें find

देखें यह लेख कुछ और जानकारी के लिए।


इसके अलावा, findकुछ अनुकूलन प्रदान करता है exec cmd {} +- जब उस तरह से चलाया जाता है, तो findफाइल को कमांड के अंत में पाया जाता है बजाय इसे एक बार फाइल करने के लिए (ताकि कमांड केवल एक बार चलाया जा सके, यदि संभव हो)।

व्यवहार में अंतर (यदि दक्षता में नहीं है) आसानी से ध्यान देने योग्य है अगर साथ चलाया जाता है ls, जैसे

find ~ -iname '*.jpg' -exec ls {} \;
# vs
find ~ -iname '*.jpg' -exec ls {} +

यह मानते हुए कि आपके पास कुछ jpgफाइलें हैं ( कम पर्याप्त रास्तों के साथ ), परिणाम पहले मामले में प्रति फ़ाइल एक पंक्ति है और lsबाद के लिए कॉलम में फ़ाइलों को प्रदर्शित करने के मानक व्यवहार है।


1
मुझे लगता है कि यह फायदेमंद आप विपरीत के लिए किया जाएगा \;के साथ +
केविन

यह कैसे अलग है find . -name * | ls -a -?
आंद्रे हमर

@ DrH वाइल्डकार्ड विस्तार को शेल करने की बात नहीं है, बल्कि वाइल्डकार्ड अभिव्यक्ति को पास करना है find। इसके अलावा, lsइस मामले में आउटपुट जाहिरा तौर पर इनपुट पर निर्भर नहीं करता है - कोई फर्क नहीं पड़ता कि मैं एक फिल्टर के रूप में क्या उपयोग करता हूं find, lsबस काम करने वाली निर्देशिका सामग्री को प्रदर्शित करता है और बस। उदाहरण के लिए चेक find ~ -iname '*.jpg' -exec ls -a {} \;बनाम find ~ -iname '*.jpg' | ls -a
चांदनीसुख

@ डीआरएच या भी echo 'foo' | ls -a
चांदनीसुख

@ moon.musick, मेरा मानना ​​है कि आपने -अपने ls -a -आदेश में महत्वपूर्ण को याद किया जब @ डॉ-एच ने परीक्षण किया था।
डैनियल Llewellyn

20

कमांड के लिए मैनपेजfindमैनपेज आइकन से :

-exec command ;
              Execute  command;  true if 0 status is returned.  All following arguments to find are taken to be arguments to
              the command until an argument consisting of `;' is encountered.  The string `{}' is replaced  by  the  current
              file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it
              is alone, as in some versions of find.  Both of these constructions might need to be escaped (with a  `\')  or
              quoted  to  protect them from expansion by the shell.

तो यहाँ स्पष्टीकरण है:

{}का अर्थ है "आउटपुट find"। जैसा कि, "जो भी findमिला"। findउस फ़ाइल का पथ लौटाता है जिसे आप खोज रहे हैं, है ना? इसलिए {}इसे बदल देता है; यह प्रत्येक फ़ाइल के लिए एक प्लेसहोल्डर है जिसे findकमांड लोकेट करता है ( यहाँ से लिया गया है )।

\;हिस्सा मूल रूप से कह रहा है find"ठीक है, मैं आदेश मैं निष्पादित करने के लिए चाहता था के साथ किया हूँ"।

उदाहरण:

मान लीजिए कि मैं .txtफ़ाइलों से भरी निर्देशिका में हूं । मैं तो चला:

find . -name  '*.txt' -exec cat {} \;

पहला भाग, फ़ाइलों find . -name *.txtकी सूची लौटाता है .txt। दूसरे भाग, -exec cat {} \;निष्पादित करेंगे catद्वारा पाया हर फ़ाइल के लिए आदेश findहां, तो cat file1.txt, cat file2.txt, और इतने पर।


4
भाग के *.txtरूप में उद्धृत किया जाना चाहिए '*.txt'। ऐसा इसलिए है क्योंकि यदि .txtवर्तमान फ़ोल्डर में फाइलें हैं , तो शेल इसका विस्तार करेगा और आपको गलत परिणाम या त्रुटि संदेश मिलेगा। find -name '*.txt' -exec cat {} \;
धान लैंडौ

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