~ के साथ समाप्त होने वाली अस्थायी फ़ाइलों को हटाने के लिए आदेश


15

कई दिनों पहले, मुझे यह उपयोगी बैश उपनाम (मेरी ~ / .bash_aliases की सामग्री ) मिला

# aliases

# finds temporary files ending with '~' and deletes them
alias rm~='find . -name '*~' -print0 | xargs -0 /bin/rm -f'

अब मैंने कुछ निर्देशिका के rm~बाद उपयोग करने का प्रयास किया cdजिसमें 3 फाइलें समाप्त हो रही थीं~

मुझे टर्मिनल में यह त्रुटि मिली, और फाइलें डिलीट नहीं हुईं

find: paths must precede expression: 1n.in~
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

इसके अलावा जब मैंने कोशिश rm~की /home/me, तो ऐसा कुछ भी नहीं हो रहा था। या इसमें काफी समय लग सकता है।

कृपया मुझे बताएं कि मुझे त्रुटि क्यों हो रही है, और इसे कैसे ठीक किया जाए।

धन्यवाद!

जवाबों:


26

आपका बैश उपनाम अच्छी तरह से नहीं लिखा गया है (एकल उद्धरण अच्छी तरह से उपयोग नहीं किए गए हैं)। इसके बजाय यह होना चाहिए:

alias rm~='find . -name "*~" -print0 | xargs -0 /bin/rm -f'

अब, मुझे व्यक्तिगत रूप से पाइप के बेकार उपयोग पसंद नहीं हैं और xargs, इसलिए आपका उपनाम इस तरह लिखा जाएगा:

alias rm~='find . -name "*~" -type f -exec /bin/rm -fv -- {} +'

-type fकेवल फ़ाइलें (नहीं निर्देशिका, लिंक, आदि), खोजने के लिए इतनी के रूप में विकल्प -vके लिए विकल्प rmइतनी के रूप में अत्यधिक शब्द (बाहर क्या यह हटाने प्रिंट) किया जाना है। +अंत में इतना है कि findरन rm(spawns उसमें केवल एक ही सब पाया फ़ाइलों के साथ rmफ़ाइल प्रति एक के बजाय)।

अब से man bash:

लगभग हर उद्देश्य के लिए, शेल कार्यों द्वारा एलियंस को अलग कर दिया जाता है।

एक उपनाम के बजाय, एक फ़ंक्शन का उपयोग करना बेहतर है: .bash_aliasesफ़ाइल में अपना उपनाम लिखें (यानी, #उस पंक्ति के सामने एक डालें ), और फ़ाइल में .bashrc, इस फ़ंक्शन (फ़ाइल में कहीं भी, अंत में ठीक है) डालें :

rm~() {
    find . -name "*~" -type f -exec /bin/rm -fv -- {} +
}

इसके अलावा, अन्य उत्तर के रूप में, आप -deleteआदेश का उपयोग कर सकते हैं खोजने के लिए। इस स्थिति में, आपका rm~कार्य होगा:

rm~() {
    find . -name "*~" -type f -printf "Removing file %p\n" -delete
}

वास्तव में, आप एक शांत फ़ंक्शन बना सकते हैं जो एक तर्क लेगा, कहेगा --dry-run, यह केवल आउटपुट करेगा जो इसे हटा देगा:

rm~() {
    case "$1" in
    "--dry-run")
        find . -name "*~" -type f -printf "[dry-run] Removing file %p\n"
        ;;
    "")
        find . -name "*~" -type f -printf "Removing file %p\n" -delete
        ;;
    *)
        echo "Unsupported option \`$1'. Did you mean --dry-run?"
        ;;
    esac
}

तो के रूप में उपयोग करें:

rm~ --dry-run

केवल उन फ़ाइलों को दिखाने के लिए जिन्हें हटा दिया जाएगा (लेकिन उन्हें हटाएं नहीं) और फिर

rm~

जब आप इससे खुश होते हैं।

अपनी आवश्यकताओं के अनुकूल और विस्तृत करें!

ध्यान दें। परिवर्तनों को प्रभावी करने के लिए आपको एक नया टर्मिनल खोलना होगा।


धन्यवाद! यह अच्छी तरह से काम करता है, और सूखा रन बेहद मददगार है।
विनायक गर्ग

2
find -type f -name '*~' -delete(पसंद का हथियार, इसके अलावा git clean -dfx .)
sehe

2
यह इतना सुरुचिपूर्ण समाधान है, मुझे आपको प्रॉपर देने के लिए बस लॉगिन करना था। आप मेरे लिए, मेरे अच्छे साथी!
कोडिंक

9

*~शेल द्वारा विस्तारित किया जाता है इससे पहले कि वह आपके उपनाम को सौंपा जाए। वास्तविक कार्य है:

alias rm~='find .name some~ file~ 1n.in~ -print0 | xargs -0 /bin/rm -f'

मैं उपनाम के बजाय फ़ंक्शंस का उपयोग करने का सुझाव देता हूं, ये उद्धरण के संबंध में बहुत अधिक शक्तिशाली और आसान हैं।

जब हम इस पर होते हैं, तो सतही को हटा दें .(यदि कोई पैरामीटर नहीं दिया गया है तो वर्तमान निर्देशिका निहित है) और पहले से मौजूद विकल्प के xargsबाद से दुरुपयोग करना बंद कर दें -delete

rm~() { find -name '*~' -ls -delete; }

-lsविकल्प वैकल्पिक है, लेकिन इसे जोड़ने तुम्हें दिखाता हूँ जो फ़ाइलें हटा दिए।


+1 धन्यवाद! लेकिन मैं इस फ़ंक्शन को कहां जोड़ूं?
विनायक गर्ग

@VinayakGarg आप इसे अपने .bash_aliasesभी जोड़ सकते हैं , लेकिन मैं आमतौर पर उन्हें सीधे अपने में डाल देता हूं .bashrc
लेकेन्स्टाइन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.