2012-10-18 9 views
21

कई सूत्रों का कहना है कि की {} प्रत्येक उदाहरण फ़ाइल नाम ढूंढने के माध्यम से पाया साथ प्रतिस्थापित किया जाएगा, लेकिन जब मैं निम्नलिखित चलाने का प्रयास, मैं केवल एक पाठ फ़ाइल मिलता है और इसके नाम ".txt""find -exec" में कई बार मौजूदा फ़ाइल नाम ("{}") का उपयोग करें?

find /directory -name "*pattern*" -exec cut -f8 {} > {}.txt \; 
है

लक्ष्य प्रत्येक फ़ाइल से केवल आठवें कॉलम के साथ एक टेक्स्ट फ़ाइल बनाना था, और प्रत्येक टेक्स्ट फ़ाइल का नाम मूल फ़ाइल के नाम पर रखा जाएगा। {} के दूसरे सेट के बारे में कुछ प्रत्येक फ़ाइल के फ़ाइल नाम के साथ प्रतिस्थापित नहीं है।

उत्तर

22

प्रयास करें:

find /directory -name "*pattern*" -exec sh -c 'cut -f8 {} > {}.txt' \; 

लेकिन ध्यान रखें कि के कुछ संस्करणों एक अलग तर्क होने के लिए {} आवश्यकता पाते हो, और नहीं तो एक फ़ाइल नाम को {} का विस्तार नहीं होगा। आप के आसपास काम कर सकते हैं के साथ कि:।

find /directory -name "*pattern*" -exec sh -c 'cut -f8 $0 > $0.txt' {} \; 

(इस वैकल्पिक आदेश उपनिर्देशिका जो मिलान फ़ाइल में आउटपुट फ़ाइल डाल देंगे अगर वांछित, आप ${0#*/}

के लिए पुनः निर्देशित द्वारा उस से बचने सकता है मुद्दा है कि find पुनर्निर्देशन नहीं कर रहा है, खोल है आपका आदेश करने के लिए वास्तव में समतुल्य है। मानक से निम्नलिखित

# Sample of INCORRECT code 
find /directory -name "*pattern*" -exec cut -f8 {} \; > {}.txt 

नोट:

यदि एक से अधिक तर्कों में केवल दो वर्ण "{}" मौजूद हैं, तो व्यवहार निर्दिष्ट नहीं है।

यदि कोई उपयोगिता_नाम या तर्क स्ट्रिंग में दो वर्ण "{}" होते हैं, लेकिन केवल दो वर्ण "{}" नहीं होते हैं, तो यह कार्यान्वयन-परिभाषित किया जाता है कि क्या वे दो वर्णों को प्रतिस्थापित करते हैं या बिना परिवर्तन किए स्ट्रिंग का उपयोग करते हैं।

+0

मुझे लगता है कि, आपके फिक्स ने चाल की है। धन्यवाद! मैं सोच रहा था कि> गलत तरीके से गलत किया गया था – user1757862

10

चेतावनियां कि विलियम Pursell अपने जवाब में बताया गया के साथ सौदा करने के लिए निम्न का उपयोग करें:

find /directory -name "*pattern*" -exec sh -c 'cut -f8 "$1" > "$1.txt"' x {} \; 

जब आप sh -c उपयोग करें, यह स्ट्रिंग निष्पादित करने के लिए निम्नलिखित तर्क से स्थितीय मापदंडों हो जाता है । अतिरिक्त x$0 में भरता है, और प्रतिस्थापित फ़ाइल नाम $1 बन जाएगा।

डबल कोट्स रिक्त स्थान और अन्य विशेष पात्रों वाले फ़ाइल नामों के साथ ठीक से काम करने की अनुमति देते हैं।

+0

+1: अच्छी तकनीक –

+0

$ 0 का उपयोग न करने का कोई कारण नहीं: 'sh -c' ... $ 0 ... '{} '? –

+0

अधिकतर इसे "गलत" लगता है - $ 0 को शेल का नाम माना जाता है, पैरामीटर नहीं। मुझे नहीं पता कि इसका उपयोग करने के लिए पोर्टेबल कितना है। – Barmar

1
find /directory -name "*pattern*" | xargs awk '{z=FILENAME".txt";print $8>z}' 
संबंधित मुद्दे