ls | grep | rm - इस कमांड को फॉर्मेट कैसे करें?


11

मैं एक निश्चित निर्देशिका (मैक ओएस एक्स पर टर्मिनल का उपयोग कर) में फ़ाइलों का एक गुच्छा हटाने की कोशिश कर रहा हूँ

ls | grep \([1-9]\) | xargs rm

चाल करना चाहिए, लेकिन यह नहीं है। मैं फ़ाइल नाम (वेब ​​से डाउनलोड किए गए डुप्लिकेट) में कोष्ठक में एक अंक वाली किसी भी फ़ाइल को हटाने की कोशिश कर रहा हूं, लेकिन यह कुछ इस तरह से समाप्त होता है:

> rm: 520syllabus2010: No such file or
> directory rm: (3).pdf: No such file or
> directory

क्योंकि यह अंतरिक्ष की सही व्याख्या नहीं करता है। इसे "520syllabus2010 (3) .pdf" को हटाना चाहिए

ऐसा करने का उचित तरीका क्या है?

धन्यवाद, जेफ


1
आपके उदाहरण फ़ाइल नाम में शाब्दिक नहीं है #
बेंजामिन बैनियर

1
@ हाँक: वह एक शाब्दिक की तलाश में नहीं है #
इग्नासियो वाज़क्वेज़-अब्राम्स

1
शेल द्वारा विस्तार के कारण, यह अपेक्षा के अनुरूप काम नहीं करेगा यदि cwd के पास उदाहरण के लिए फ़ाइल है (3)। तर्कों को उद्धृत करना सबसे अच्छा है ताकि शेल उन्हें प्रभावित न करे।
इग्नासियो वाज़क्वेज़-अब्राम्स

1
आप विभाजक समस्या से प्रभावित हो रहे हैं en.wikipedia.org/wiki/Xargs#The_separator_problem
Ole Tange

जवाबों:


19

लघु संस्करण:

rm *\([1-9]\)*

पाइप न lsकरें xargs। इसके बजाय, ऐसी समस्याओं से बचने के find ... -print0लिए , पाइप करें xargs -0

find . -maxdepth 1 -name '*([1-9])*' -print0 | xargs -0 rm

... जो इस प्रकार लिखा जा सकता है:

find . -maxdepth 1 -name '*([1-9])*' -exec rm {} \;

तथा:

find . -maxdepth 1 -name '*([1-9])*' -delete

जो आगे सिर्फ rmएक वाइल्डकार्ड के साथ छोटा किया जा सकता है ।


आम तौर पर, lsऔर findnewlines के साथ अलग फ़ाइल नाम, लेकिन xargsnewline या अंतरिक्ष द्वारा इसके इनपुट को विभाजित करता है, जिसके परिणामस्वरूप आप देखते हैं।

यह संभव है कि xargsकेवल न्यूलाइन से विभाजित करने के लिए कहा जाए, लेकिन फाइलों में उनके नाम में भी नया अंक हो सकता है। वास्तव में, Linux और BSD पर, केवल अनुमति नहीं चरित्र है "अशक्त" या शून्य बाइट - तो यह है कि तुम क्या ऐसे मामलों में इस्तेमाल करना चाहिए है।

ऊपर के उदाहरण 2 में, एक नल बाइट के साथ अलग-अलग फ़ाइलनाम को -print0बताता findहै; उसी के लिए xargs -0। (कुछ अन्य उपकरण भी इस तरह के रूप में इसी तरह के विकल्प, है sort -zया grep -zZ।)

"लघु संस्करण" एक सरल शेल वाइल्डकार्ड का उपयोग करता है ( bashमैनुअल में "पैटर्न" - अनुभाग "पथनाम विस्तार" देखें)।


1
और सुरक्षित होने के लिए, इसका उपयोग करना बेहतर है *" "\\([1-9]\\).*ताकि केवल (ए, निष्पक्ष होने के लिए) अवधि से पहले paren'd संख्या से पहले की जगह वाली फाइलें हटा दी जाएं।
इग्नासियो वाज़क्वेज़-अब्राम्स

इस वाक्य रचना से बहुत परिचित नहीं हैं, लेकिन उत्थान के आधार पर मैंने इसे एक कोशिश दी और आप क्या जानते हैं ... यह काम किया! धन्यवाद!
जेफ

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