सबसे अच्छा तरीका है एक डायरेक्टरी ट्री में प्रत्येक फाइल पर कमांड चलाना


13

शेल स्क्रिप्ट, लूप और xargs में लूप सहित ऐसा करने के कई तरीके दिखाई देते हैं। इनमें से कौन सा सबसे अच्छा है, और कौन सा सबसे पोर्टेबल है?

जवाबों:


13
find . -exec <command> {} \;

वृक्ष की जड़ या सामान्य रूप में वर्तमान निर्देशिका के लिए:

find <directory> -exec <command> {} \;

4
कुछ प्रणालियों पर न ही -exec विकल्प मिलता है जिससे आप पा सकते हैं। | xargs <कमांड>
हेमंत

4
वास्तव में, और यदि आपको किसी चीज़ को फ़िल्टर करने की आवश्यकता है, तो निर्देशिकाओं के -name "*.c"लिए प्रयास करें या उदाहरण के -type dलिए ...

खोजें आश्चर्यजनक रूप से जटिल चीजें कर सकती हैं - आप पूर्ण विकल्प सूची के लिए मैन पेज - unixhelp.ed.ac.uk/CGI/man-cgi?find पर चेक करना चाहते हैं ।
लुकास जोन्स

तुम भी रिक्त स्थान के साथ फ़ाइल नाम के लिए देखना चाहते हो सकता है, जो -exec और xargs दृष्टिकोण को तोड़ सकता है। देखिए smallurl.com/ygvgmw5
शॉन चिन

यदि संभव हो, तो find ... | xargs ...मुहावरे का उपयोग करें , यह बैचों में फाइलों को संसाधित करता है, और यह आमतौर पर तेज होगा (लॉन्च की गई कम प्रक्रियाएं)।
वॉनब्रांड २३'१३

5

का प्रयोग करें -print0खोजने के लिए विकल्प और -0करने का विकल्प xargsहै, तो आप रिक्त स्थान के साथ फ़ाइल या निर्देशिका नाम है:

find {dir} -print0 | xargs -0r {command}

व्हॉट्सएप से अलग की गई सूची के बजाय -print0फाइलनेम को प्रिंट के रूप में प्रिंट करने का विकल्प NUL, जबकि व्हॉट्सएप पर इसके इनपुट को तोड़ने -0का xargsनिर्देश देने का विकल्प NUL। चूँकि NULयूनिक्स फाइलनामों में ऐसे पात्रों में से एक की अनुमति नहीं है, इसलिए फ़ाइल नाम के भाग के लिए गलत होने का कोई तरीका नहीं है।

-rविकल्प वहाँ इतना है कि है xargsतो आपको एक त्रुटि नहीं देंगे, तो यह कोई इनपुट है।


3

यदि पोर्टेबिलिटी एक ऐसा मुद्दा है जिसे करने के शैल-विशिष्ट तरीकों से मैं दूर रहूंगा (बहुत सारे लोग विभिन्न शेल का उपयोग कर रहे हैं, लेकिन सामान्य रूप से और xargs वास्तव में बुनियादी उपकरण हैं जो कोई भी कट्टरपंथी तरीके से बदलने की हिम्मत नहीं करेगा) ।

खोजने और xargs के बुनियादी तर्कों का उपयोग करके आपको अधिक पोर्टेबल समाधान देना चाहिए।


2

अगर एक साथ तर्क करना स्वीकार्य है, तो खोजें | xargs शायद बेहतर परफॉर्मेंस देंगे, क्योंकि यह कमांड को फाइंड -सेक्स की तुलना में बहुत कम बार निष्पादित करेगा। यदि आप प्रत्येक फ़ाइल के लिए हर बार कमांड निष्पादित करना चाहते हैं या फ़ाइल के उपनिर्देशिका में निष्पादित करते हैं, तो आपको शायद -exec या -execdir का उपयोग करना चाहिए।

एक नियम के रूप में, शेल-विशिष्ट छोरों से दूर रहना बेहतर है; अधिकांश परिदृश्यों के लिए & xargs पर्याप्त हैं।


1

सुनिश्चित करें कि आपके द्वारा उपयोग किए जा रहे कमांड का संस्करण पहले से ही पुनरावर्ती ऑपरेशन के लिए ध्वज नहीं है। :)


0
find [args] -print | xargs {command}

मेरे लिए सबसे अच्छा काम करता है।


2
-1 रिक्त स्थान वाले फ़ाइल नाम के लिए काम नहीं करेगा। बेहतर उपयोग खोजें -प्रिंट0 | xargs -0।
स्टारब्ले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.