खोज - निष्पादित आरएम बनाम -डेलीट


260

मैं इन दोनों आज्ञाओं के बीच के अंतर को समझने की कोशिश कर रहा हूँ:

sudo find / -name .DS_Store -delete

तथा

sudo find / -name ".DS_Store"  -exec rm {} \;

मैंने देखा कि execविधि को प्राथमिकता दी जाती है। क्यों? कौन सा अधिक सुरक्षित / तेज / बेहतर है? मैंने अपनी मैकबुक पर दोनों का उपयोग किया है और सब कुछ अच्छी तरह से काम करता है।

जवाबों:


245

-delete बेहतर प्रदर्शन करेंगे, क्योंकि इसमें प्रत्येक और प्रत्येक मिलान वाली फ़ाइल के लिए एक बाहरी प्रक्रिया नहीं है।

यह संभव है कि आप -exec rm {} \;अक्सर अनुशंसित देख सकते हैं क्योंकि -deleteसभी संस्करणों में मौजूद नहीं है find। मैं अभी जाँच नहीं कर सकता, लेकिन मुझे पूरा यकीन है कि मैंने इसके findबिना उपयोग किया है ।

दोनों तरीके "सुरक्षित" होने चाहिए।

EDIT प्रति टिप्पणी @doitmyway से: सुनिश्चित करें कि आप नाम पर मिलान करते हैं और फिर हटाते हैं, न कि दूसरे तरीके से (हटाएं, फिर मिलान करें)। अन्यथा हर फ़ाइल को हटा दिया जाएगा, चाहे वह मेल खाता हो या नहीं । यानी, ऐसा न करें find / -delete -name .DS_Store:।

प्रत्येक मिलान की गई फ़ाइल के लिए एक बाहरी प्रक्रिया को जन्म देने से बचने के लिए एक सामान्य तरीका है:

find / -name .DS_Store -print0 | xargs -0 rm

(लेकिन ध्यान दें कि यहां पोर्टेबिलिटी की समस्या भी है: खोज के सभी संस्करण नहीं हैं -print0!)


2
समझा। मैंने यह भी पढ़ा है कि निर्दिष्ट फ़ाइल ट्री को हटाने से -deleteपहले स्विच का उपयोग करना -name, इसलिए मुझे लगता है कि मुझे सावधान रहना होगा।
प्याज

8
हाल ही में findआप -exec rm {} +एकल rmकमांड के साथ सभी मिलान वाली फ़ाइलों को हटाने के लिए उपयोग कर सकते हैं ।
18

3
.DS_Storeइसमें कोई विशेष वर्ण नहीं है, इसलिए उद्धरण अनावश्यक हैं और इस मामले में कुछ भी नहीं बदलते हैं।
सेलडा

1
मूल रूप से केवल व्हाट्सएप (रिक्त स्थान, टैब, शायद अन्य) ही एकमात्र ऐसी चीज है जिसके कारण दो अलग-अलग कमांड लाइन तर्कों के रूप में एक अयोग्य स्ट्रिंग की व्याख्या की जाती है, लेकिन यह निर्णय लेने या न करने का निर्णय लेने पर आप सभी को खेद है। आप के बारे में चिंता करने की ज़रूरत सभी तरह खोल अक्षरों से परे ;या |या >या <और `` और कई अन्य जिसे खोल करने के लिए विशेष अर्थ नहीं होता है जब तक कि उद्धृत।
सेलडा

1
@MarcoMarsala xargsसीमित आकार के तर्क सूची की समस्या को पारदर्शी रूप से कमांड के कई चालन में तोड़कर देखभाल करता है।
सेलाडा

27

मान लें कि .DS_Storeफ़ाइलों का प्रतिनिधित्व करते हैं और निर्देशिकाओं का नहीं, यह करने के लिए अभी भी सबसे पोर्टेबल तरीका है:

sudo find / -name .DS_Store -exec rm {} +

एकमात्र जोखिम sudoउपलब्ध नहीं होने के लिए है लेकिन यह आजकल काफी कम है।

-deleteविकल्प जीएनयू खोजने के लिए और अभी भी कई अन्य गैर मानक है की मांग करने के लिए प्रयोग किया जाता findकार्यान्वयन, इसलिए हमेशा उपलब्ध नहीं है।

कमांड टर्मिनेशन के +बजाय फाइल सिस्टम पर मौजूद प्रत्येक के लिए कमांड न चलाकर क्लॉज का \;अत्यधिक अनुकूलन करता है।execrm.DS_Store


16

आपकी मैकबुक जैसी मशीन के लिए आपको दो कमांडों के बीच प्रदर्शन में ज्यादा अंतर नहीं मिलेगा। हालाँकि, यदि आप -exec संस्करण को देखते हैं तो आप एक सूक्ष्म अंतर देख सकते हैं:

sudo find / -iname ".file-to-delete"  -exec rm {} \;

इसका मतलब है कि आप उन सभी फाइलों को ".file-to-delete" नाम से पाएंगे। हालाँकि यह खोज कुछ अवांछित झूठी सकारात्मक लौटा सकती है। सुडो के साथ कुछ करते समय आपको थोड़ा अधिक सावधान रहना चाहिए। -Exec rm {} का उपयोग करने का लाभ यह है कि आप rm को इस तरह से तर्क पारित कर सकते हैं:

sudo find / -iname "*~"  -exec rm -i {} \;

इस उदाहरण में मैं उन बैकअप फ़ाइलों को हटाना चाहता हूं जो एमएसीएस बनाती है। हालाँकि वह टिल्ड कुछ अस्पष्ट फ़ाइल में हो सकता है जिसके बारे में मुझे जानकारी नहीं है और वह महत्वपूर्ण हो सकती है। साथ ही मैं डिलीट की पुष्टि करना चाहता हूं। इसलिए मैंने rm कमांड पर '-i' विकल्प रखा। यह मुझे एक इंटरैक्टिव डिलीट देगा।

इसके अलावा आप निर्देशिकाओं के साथ ही फाइलों को हटाने के लिए rm के उपयोग को परिष्कृत कर सकते हैं:

find /usr/local/share/ -iname "useless" -exec rm -r {} \;

संक्षेप में, -exec आपको वास्तविक कमांड पर थोड़ा अधिक नियंत्रण देता है जो मिली हुई वस्तु को हटा देता है। लाभ यह है कि आप फ़ाइलों को खोजने के लिए एक उपकरण का उपयोग करते हैं, उन्हें हटाने के लिए एक और उपकरण। खोज उपयोगिता के प्रत्येक संस्करण में -delete विकल्प भी नहीं है। इसलिए बेहतर है कि प्रत्येक उपकरण को उसके उचित काम के लिए इस्तेमाल किया जाए। यह यूनिक्स दर्शन है - एक उपकरण, एक काम, उन्हें एक साथ उपयोग करने के लिए जो आपको करने की आवश्यकता है।


3
इंटरैक्टिव पुष्टि -ok rm {} \;के -exec rm {} \;लिए भी देखें ।
Kusalananda
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.