2012-11-05 28 views
6

मैं किसी अन्य कमांड के पैरामीटर के रूप में कमांड के तत्वों की आउटपुट सूची पास करना चाहता हूं। मैं कुछ अन्य पन्नों पाया है:किसी अन्य कमांड के पैरामीटर के रूप में लिनक्स कमांड आउटपुट

लेकिन वे और अधिक जटिल होने लगते हैं।

मैं सिर्फ लिनक्स find कमांड पर कॉल के हर परिणाम में एक फ़ाइल कॉपी करना चाहता हूं।

यहाँ क्या गलत ?:

find . -name myFile 2>&1 | cp /home/myuser/myFile $1 

धन्यवाद

उत्तर

16

यह तुम क्या चाहते है:

find . -name myFile -exec cp /home/myuser/myFile {} ';' 

एक टूटने/इस बात का स्पष्टीकरण:

  • find: वर्तमान कार्यशील निर्देशिका से खोज शुरू करें: खोजने के आदेश
  • . लागू।
  • के बाद से कोई गहराई झंडे निर्दिष्ट कर रहे हैं, यह सब सबफ़ोल्डर
  • -name myFile के लिए रिकर्सिवली खोजेगा: स्पष्ट नाम myFile
  • -exec साथ फ़ाइलों को ढूंढना: खोज परिणामों के लिए, उन लोगों के साथ अतिरिक्त आदेशों प्रदर्शन
  • cp /home/myuser/myFile {}: प्रतियां /home/myuser/myFilefind द्वारा लौटाए गए प्रत्येक परिणाम को ओवरराइट करने के लिए; {} के बारे में सोचें जहां प्रत्येक खोज परिणाम जाता है।
  • ';': विभिन्न आदेश अलग करने के लिए प्रयोग किया जाता है के बाद find
+0

बस/home/myuser/myFile के बाद, {} की स्थिति को दूसरे स्थान पर बदलें, और यह काम करेगा। धन्यवाद। –

+0

@ लुइस एंड्रेस गारिया, आह, मैंने आपको गलत समझा होगा - आप सीडब्ल्यूडी में 'ढूंढ' द्वारा पाए गए किसी भी 'माईफाइल' को ओवरराइट करने के लिए एक फ़ाइल '/ home/myuser/myFile' की प्रतिलिपि बनाना चाहते थे? –

+0

आप सही हैं! :) किसी और मिली फ़ाइल के गुणों को सूचीबद्ध करने के लिए एक और उदाहरण है: find -exec ls -l {} ';' –

2

है पाइप दूसरे के इनपुट करने के लिए एक कार्यक्रम का उत्पादन भेज देंगे। cp टर्मिनल पर अपनी इनपुट स्ट्रीम से नहीं पढ़ता है, यह केवल कमांड लाइन पर तर्कों का उपयोग करता है।

आप या तो पाइप के बजाय पाइप या find के exec तर्क के साथ xargs का उपयोग करना चाहते हैं।

+2

आपको एक उदाहरण दे सकते हैं , कृप्या? आपका बहुत बहुत धन्यवाद। –

3

इस, चाहे आप रिक्त स्थान या उनके नाम में अन्य विशेष वर्ण के साथ फ़ाइलों के बारे में चिंता करने की जरूरत पर निर्भर करता है हल करने के तरीकों की एक जोड़ी रहे हैं चलाने के लिए।

यदि किसी भी फ़ाइल नाम में रिक्त स्थान या विशेष वर्ण नहीं हैं (उनमें केवल अक्षरों, संख्याओं, डैश और अंडरस्कोर शामिल हैं), तो निम्न कार्य एक सरल समाधान है जो काम करेगा। आप आदेश को निष्पादित करने के लिए $(command) का उपयोग कर सकते हैं, और परिणामों को किसी अन्य कमांड के तर्कों में प्रतिस्थापित कर सकते हैं। शेल स्पेस, टैब या न्यूलाइन पर परिणाम को विभाजित करेगा, और for बदले में प्रत्येक मान को $f पर असाइन करें, और प्रत्येक मान पर कमांड चलाएं।

for f in $(find . -name myFile) 
do 
    cp something $f 
done 

आप रिक्त स्थान या टैब की क्या ज़रूरत है, तो आप इस्तेमाल कर सकते हैं खोजने के -exec विकल्प। आप -exec command args पास करते हैं, {} डालते हैं जहां आप फ़ाइल नाम को प्रतिस्थापित करना चाहते हैं, और ; के साथ तर्क समाप्त करना चाहते हैं। आपको {} और ; उद्धृत करने की आवश्यकता है ताकि खोल उन्हें समझ न सके।

find . -name myFile -exec cp something "{}" \; 

कभी-कभी -exec पर्याप्त नहीं है। उदाहरण के लिए, this question में, वे फ़ाइल नाम की गणना करने के लिए बैश पैरामीटर विस्तार का उपयोग करना चाहते थे। ऐसा करने के लिए, आपको -exec bash -c 'your command' पास करने की आवश्यकता है, लेकिन फिर आप {} प्रतिस्थापन के साथ समस्याओं को उद्धृत करने में भाग लेंगे। इस समस्या के समाधान के लिए, आपको find से -print0 उपयोग कर सकते हैं अशक्त वर्ण (जो फ़ाइल नाम में अमान्य हैं) के साथ सीमांकित परिणाम प्रिंट, और पाइप यह एक while read पाश कि nulls पर मापदंडों विभाजन करने के लिए:

find . -name myFile -print0 | (while read -d $'\0' f; do 
    cp something "$f" 
    done)