जब डिलीट हुए बिना पाया गया तो वे मेरे-सेव / डायरेक्ट्री में फाइलों को मिटा क्यों नहीं पाए?


20

मैं मौजूदा निर्देशिका ट्री की सभी फाइलों को हटाना चाहता हूं, सिवाय उन के save। मैंने यह आदेश चलाया:

 find . \( -name save -prune \) -o -type f -ls | grep /save/

और यह कोई नहीं मिला। लेकिन जब मैंने यह कमांड चलाई:

 find . \( -name save -prune \) -o -type f -delete

वे सभी फ़ाइलें / सहेजें / चले गए थे। मुझे किसकी याद आ रही है?


4
आउच ... मैंने आज कुछ सीखा (आपके लिए धन्यवाद)। और मैं mv save/ ../some/safer/locationइस तरह के "जेनेरिक" डिलीट कमांड (... लेकिन निश्चित रूप से, आपके पोस्ट से पहले मैंने एक ही चेक किया था और एक ही मुसीबत में भाग गया था) से पहले एक साधारण सलाह देता हूं । अब फाइल्स सिस्टम के लिए एक अच्छी "अनडिलीट" ढूंढिए। फाइल्स ^ ^ पर थीं
ओलिवियर दुलैक

3
मेरा दर्द तुम्हारी रोकथाम है।
ओथियस

1
आपको धन्यवाद। कोड (अक्सर?) रहस्यमय तरीके से काम करता है ...
ओलिवियर दुलक


@lesmana मैंने वहां आपके जवाब को गलत बताया। दुख की बात है कि मेरे खोज के संस्करण ने मुझे इतनी अच्छी चेतावनी नहीं दी :(
ओथियस

जवाबों:


26

-deleteतात्पर्य है -depthकि -prune( -depthपत्तियों के साथ शुरू होता है) के साथ काम नहीं करता है । जीएनयू संस्करण के मैनुअल में इसके बारे में एक चेतावनी है ( -deleteयह एक फ्रीबीएसडी एक्सटेंशन है जो अब जीएनयू findऔर कुछ अन्य कार्यान्वयनकर्ताओं द्वारा भी समर्थित है )।

info find --index-search=-delete

कमांड लाइन पर '-डेलीट' कार्रवाई का उपयोग स्वचालित रूप से '-depth' विकल्प (* नोट फाइंड एक्‍सप्रेस: ​​:) पर होता है। यह आश्चर्यजनक हो सकता है यदि आप पहले सिर्फ '-प्रिंट' के साथ परीक्षण कर रहे थे, इसलिए आमतौर पर '-epepth' का स्पष्ट रूप से उपयोग करना याद रखना सबसे अच्छा है।

info find --index-search=-prune

चूँकि '-डेलीट' का अर्थ '-डेप' होता है, '-डेलीट' के साथ संयोजन में '-प्र्यून' का उपयोग करने से आपके द्वारा की गई अपेक्षा से अधिक फ़ाइलों के विलोपन हो सकते हैं।

यहां, आपको rmइसके बजाय उपयोग करने का विकल्प मिला है :

find . -name save -prune -o -type f -exec rm -f {} +

(संभावित रूप से असुरक्षित अगर वहाँ निर्देशिका में दूसरों द्वारा लेखन योग्य हैं, क्योंकि आप उस आदेश को चलाते समय सहानुभूति के साथ निर्देशिकाओं को बदलकर वर्तमान निर्देशिका ट्री के बाहर की फ़ाइलों को हटा सकते हैं)।

एक सुरक्षित विकल्प:

find . -name save -prune -o -type f -execdir rm -f -- {} \;

ऊपर बताई गई समस्या नहीं है, लेकिन इसका अर्थ है rmप्रति फ़ाइल एक रनिंग । --FreeBSD कार्यान्वयन, नहीं उपसर्गों फ़ाइल नाम जीएनयू एक है कि साथ के लिए आवश्यक है ./

वैकल्पिक रूप से, जैसा कि कोस्टास ने सुझाव दिया है:

LC_ALL=C find . ! -name save ! -path '*/save/*' -type f -delete

(लेकिन यह अभी भी अनावश्यक रूप से saveनिर्देशिकाओं में उतरता है )

ऐसा LC_ALL=Cहै तो *बाइट्स के किसी भी क्रम से मेल खाता है (यहां तक ​​कि जो वर्तमान स्थान में वैध वर्ण नहीं बनाते हैं)। ध्यान दें कि यह त्रुटि संदेशों की भाषा (उपयोगकर्ता की भाषा के बजाय अंग्रेजी) को प्रभावित करेगा।


यहां सुरक्षा का मुद्दा क्या है rm?
jrw32982

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