Xargs के साथ तर्कों को कैसे उद्धृत करें


15

मान लीजिए कि मैं एक फ़ोल्डर में सभी फ़ाइलों को हटाना चाहता हूं जो 1 एमबी से अधिक हैं।

$ find . -size +1M | xargs -0 rm

यह उन फ़ाइलों को नहीं हटाएगा जिनके नाम में जगह है। इसलिए मैं चाहता हूं कि इसे भेजे जाने वाले सभी तर्कों को उद्धृत किया जाए rm। अगर findयह देता है Some report.docxइसे पारित करना चाहिए "Some report.docx"करने के लिए rm

मैं उसे कैसे कर सकता हूँ?


1
आप कुछ भी करने से पहले इस mywiki.wooledge.org/UsingFind?highlight=%28xargs%29 को पढ़ लेंxargs । के रूप में भी विकि पता चलता है, का उपयोग नहीं करते xargsगुजर बिना -print0करने के लिए find
वैलेंटाइन बजरमी


xargs -d$'\n'सीमांकक को केवल नई लाइनों तक सीमित करने के लिए उपयोग करें (और रिक्त स्थान नहीं; यह उद्धरण आदि को विशेष रूप से संसाधित नहीं करेगा - मैंने एक GNU सिस्टम पर जाँच की है) - stackoverflow.com/
imz - इवान ज़खरीशेव

जवाबों:


13

सरल उपयोग:

find . -size +1M -delete

आप उपयोग कर जोर देते हैं xargsऔर rmसाथ find, बस जोड़ने के -print0अपने आदेश में:

find . -size +1M -print0 | xargs -r0 rm --

अन्य रास्ता:

find . -size +1M -execdir rm -- {} +

से man find:

-print0
    True; print the full file name on the standard output, followed by a null 
character (instead of the newline character that -print uses). This allows file names 
that contain newlines or other types of white space to be correctly interpreted by 
programs that process the find output. This option corresponds to the -0 option of 
xargs.

3
यह समस्या को हल करता है लेकिन वास्तव में तर्कों को उद्धृत करना अन्य मामलों में उपयोगी होगा। तो मैं अन्य उत्तरों के लिए पकड़ लूंगा। हालांकि एक सरल समाधान के लिए +1।
क्षितिज शर्मा

2
@KshitizSharma नहीं, आप पारित करने के लिए नहीं करना चाहते "Some report.docx"करने के लिए rm, जब तक कि फ़ाइल नाम उद्धरण शामिल हैं। आप जो चाहते हैं, वह Some report.docxअनमना है rm। कसिया का जवाब (अब) सामान्य तरीका दिखाता है find। [कासिया: पहले गलत पिंग के लिए खेद है।]
गिल्स

@ गिल्स सही। बैश में मैं आम तौर पर इसे अनमोल पारित करने के लिए स्ट्रिंग उद्धृत करता हूं। इसलिए मेरे $0$1
कहने का

OSX पर मैं इसके xargs -0बजाय करते हैं xargs -r0
रॉल्फ

8

विकल्प -0का xargsअर्थ है कि पाइप से आउटपुट को शून्य समाप्त वस्तुओं के रूप में व्याख्या किया गया है। ऐसे मामले में आपको पाइप के साथ इनपुट बनाने की भी आवश्यकता है find ... -print0


6

मेरे पास एक समान आवश्यकता थी और -Iएक प्लेसहोल्डर के लिए स्विच का उपयोग करके समाप्त हो गया और मैं इसे उद्धृत करने में सक्षम था।

find . -size +1M | xargs -I {} rm "{}"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.