पैटर्न से मेल खाती फ़ाइलों को हटाने के लिए फ़ाइंड कमांड का उपयोग कैसे करें?


17

मैं एक बैश कमांड लिखने की कोशिश कर रहा हूं, जो एक विशिष्ट पैटर्न से मेल खाती सभी फ़ाइलों को हटा देगा - इस मामले में, यह पुरानी vmware लॉग फ़ाइलों में से सभी है जो निर्मित हुई हैं।

मैंने इस कमांड की कोशिश की है:

find . -name vmware-*.log | xargs rm

हालाँकि, जब मैं कमांड चलाता हूं, तो यह उन सभी फ़ोल्डरों को चोक कर देता है, जिनके नाम में स्पेस होता है। क्या फ़ाइल पथ को फ़ॉर्मेट करने का कोई तरीका है ताकि xargs इसे rm उद्धृत या ठीक से बच जाए?


जवाबों:


20

मुझे आमतौर पर लगता है कि -execविकल्प का उपयोग findकरना आसान और कम भ्रमित करने वाला है। इसे इस्तेमाल करे:

find . -name vmware-*.log -exec rm -i {} \;

-execप्रत्येक परिणाम के लिए चलने के लिए एक कमांड होने के बाद सब कुछ लिया जाता है ;, जो कि यहां से बच जाता है, ताकि इसे पास कर दिया जाए find। यह {}फ़ाइल नाम के साथ बदल दिया जाता है जो findसामान्य रूप से प्रिंट होता है।

एक बार जब आप यह सत्यापित कर लेते हैं कि यह वही है जो आप चाहते हैं, तो आप इसे हटा सकते हैं -i


1
इसके अलावा, यदि यह केवल फाइलें हैं जिन्हें आप हटाना चाहते हैं और निर्देशिकाओं को नहीं, तो आप खोज कमांड में '' -type f '' जोड़ सकते हैं।
जेम्सनह आक्ट

18

यदि आपके पास GNU है findतो आप -deleteविकल्प का उपयोग कर सकते हैं :

find . -name "vmware-*.log" -delete

xargsफ़ाइल नाम में रिक्त स्थान के साथ समस्या का उपयोग करने और उससे बचने के लिए:

find . -name vmware-*.log -print0 | xargs -0 rm

हालाँकि, आपकी लॉग फ़ाइलों में उनके नाम के स्थान नहीं होने चाहिए। वर्ड प्रोसेसिंग दस्तावेज और एमपी 3 फाइलें उनके पास होने की संभावना है, लेकिन आपको अपनी लॉग फ़ाइलों के नाम को नियंत्रित करने में सक्षम होना चाहिए।


काफी अच्छा है। मुझे इसके बारे में पता नहीं था।
जेफ स्नाइडर

8

आप findNULLs के साथ आउटपुट लिस्ट को डिलीट करने के लिए कह सकते हैं , और xargsइसकी इनपुट लिस्ट को प्राप्त करने के लिए:

$ ls -l "file 1" "file 2"
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 2

$ find . -name 'file *' -print0 | xargs -0 ls -l
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 2

$ find . -name 'file *' -print0 | xargs -0 rm -v
removed `./file 2'
removed `./file 1'

इसके अलावा, सुनिश्चित करें कि आप बच गए हैं *, या तो एक बैकस्लैश के साथ, या vmware-*.logएकल उद्धरणों को शामिल करके, अन्यथा आपका शेल इसे बंद करने से पहले इसे विस्तारित करने का प्रयास कर सकता है find


6

खोज के -deleteविकल्प को मत भूलना । यह विशेष वर्णों के साथ त्रुटि के बिना फ़ाइल को हटा दें ...

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