मैं वर्तमान निर्देशिका में किसी विशिष्ट एक्सटेंशन की सभी फ़ाइलों को कैसे पुन: हटा सकता हूं?


531

मैं .bakवर्तमान निर्देशिका से किसी विशिष्ट एक्सटेंशन (उदा ) से सभी फ़ाइलों को सुरक्षित रूप से कैसे हटाता हूं और एक कमांड-लाइन का उपयोग करके सभी सबफ़ोल्डर्स? बस, मैं उपयोग करने rmसे डरता हूं क्योंकि मैंने इसे एक बार गलत इस्तेमाल किया था और अब मुझे सलाह की जरूरत है।

जवाबों:


840

rmअगर आपको डर है तो आपको इस मामले में भी उपयोग करने की आवश्यकता नहीं है । उपयोग करें find:

find . -name "*.bak" -type f -delete

लेकिन एहतियात के साथ इसका इस्तेमाल करें। पहले चलाएं:

find . -name "*.bak" -type f

यह देखने के लिए कि आप कौन सी फ़ाइलें निकालेंगे।

इसके अलावा, सुनिश्चित करें कि-delete आपके आदेश में अंतिम तर्क है। यदि आप इसे पहले डालते हैं -name *.bak argument, तो यह सब कुछ हटा देगा

देखें man findऔर man rmअधिक जानकारी के लिए और एसई पर यह संबंधित प्रश्न भी देखें:


यह कैसे अलग है rm *.bak?
Sayantankhan

10
@ Bolt64 आपकी rm *.bakउपनिर्देशिकाओं के लिए काम नहीं करेगा।
राडू रयडेनु

डिफ़ॉल्ट सेटिंग्स के साथ rm *.bakकेवल वर्तमान निर्देशिका में .bak के साथ समाप्त होने वाली सभी फ़ाइलों को हटा दिया जाएगा। उपनिर्देशिका में उन चीजों को भी करने के लिए जिन्हें आपको ग्लब्स के साथ फील करना है, -r विकल्प का उपयोग करें या खोज उदाहरण का उपयोग करें।
हेन्नेस

9
@ हेन्स सावधान rm -r *.bak! यह .bakउनकी सभी सामग्री के साथ समाप्त होने वाली निर्देशिकाओं को भी हटा देता है।
रादु राईडेनु

37
सुनिश्चित करें कि -deleteआपके आदेश में अंतिम तर्क है। यदि आप इसे -name *.bakतर्क से पहले रखते हैं, तो यह सब कुछ हटा देगा।
माइकल

40
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f

1
Askubuntu में आपका स्वागत है! हालांकि यह पूरी तरह से मान्य उत्तर है, मुझे नहीं लगता कि -deleteझंडे के बजाय इसका उपयोग करने में कोई फायदा है findखोज के साथ फ़ाइलों को हटाने के लिए GNU मैनुअल प्रविष्टि में अधिक जानकारी पाई जा सकती है ।
Glutanimate

2
आप शायद सही हैं, यह सिर्फ एक वैकल्पिक समाधान है, शायद अधिक कच्चा है;)
lokers

11
यह सिर्फ एक विकल्प नहीं है, बल्कि एक उदाहरण है कि कैसे अन्य कमांडों को पाइप के साथ जोड़ा जा सकता है '|' +1
बोरिस पावलोवीक

13
यह वैकल्पिक समाधान अन्य वातावरणों पर काम करते हैं जो कि कमी (जैसे कि
साइबरविन

2
मुझे लगता है कि यह यहां सबसे अच्छा जवाब है।
लेओ लेपोल्ड हर्ट्ज़ '

33

पहले कमांड चलाएं shopt -s globstar। आप उसे कमांड लाइन पर चला सकते हैं, और यह केवल उस शेल विंडो में प्रभावी होगा। आप इसे अपने में डाल सकते हैं .bashrc, और फिर सभी नए शुरू किए गए गोले इसे उठाएंगे। उस कमांड का प्रभाव **/वर्तमान निर्देशिका और उसके उपनिर्देशिकाओं में मैच फ़ाइलों को पुनरावर्ती रूप से बनाना है (डिफ़ॉल्ट रूप से, **/इसका अर्थ है */: केवल तत्काल उपनिर्देशिकाओं में)। फिर:

rm **/*.bak

(या gvfs-trash **/*.bakआपके पास क्या है)


21

फ़ाइलों को हटाना मेरे लिए नहीं है जिसका आपको उपयोग करना चाहिए rm। यहाँ एक विकल्प है:

sudo apt-get install gvfs     # install a tool that allows you to put stuff in the trash
alias "trash"="gvfs-trash"    # you can also put this in .bash_aliases or simply use the command without alias
trash *.bak                   # trash the files (thus moving them to the trash bin)

जैसा कि फ्लिम टिप्पणी में बताता है:

पैकेज gvfs पर निर्भरता के बिना trash-cliएक ही काम करता है gvfs-trash

इसलिए:

sudo apt-get install trash-cli

आपको इसके लिए एक उपनाम बनाने की आवश्यकता नहीं है, क्योंकि trash-cliपैकेज एक कमांड प्रदान करता है trash, जो हमें चाहिए।

जैसा कि एलिया कगन व्यापक टिप्पणियों में स्पष्ट करता है, आप भी इस पुनरावर्ती का उपयोग कर सकते हैं find। उस स्थिति में आप एक उपनाम का उपयोग नहीं कर सकते हैं, इसलिए नीचे दिए गए आदेश मान लें कि आपने स्थापित किया है trash-cli। मैं एलियाह की टिप्पणियों को संक्षेप में प्रस्तुत करता हूं:

यह कमांड .bakवर्तमान निर्देशिका या इसके उपनिर्देशिकाओं या नीचे कहीं भी सभी फाइलों को खोजती है और सहानुभूति देती है।

find . -name '*.bak' -xtype f

उन्हें हटाने के लिए, कमांड के -execसाथ जोड़ें trash:

find . -name '*.bak' -xtype f -exec trash {} +

-xtype fफ़ाइलों का चयन करता है और फ़ाइलों के लिए सहानुभूति रखता है, लेकिन फ़ोल्डर नहीं। .Bak फ़ोल्डर को हटाने के लिए, उस भाग को हटा दें, और उपयोग करें -execdir, जो निर्देशिकाओं के अंदर फ़ाइलों के cannot trash non-existentलिए त्रुटियों से बचा जाता है :.bak.bak

find . -name '*.bak' -execdir trash {} +

4
" rmचीजों को हटाने के लिए उपयोग न करें " एक विवादास्पद बयान है, लेकिन मुझे इस बात से सहमत होना होगा कि यह कुछ का उपयोग करने के लिए अक्सर समझदार है जो आपको चीजों को पूर्ववत करने देगा।
ओली

2
पैकेज निर्भरता के बिना के trash-cliरूप में एक ही बात करता है । gvfs-trashgvfs
फ्लि‍म नोव

मैंने इसे उत्तर में संपादित किया है, अगली बार खुद को संपादित करने के लिए स्वतंत्र महसूस कर रहा हूं।
don.joey

@ don.joey यह उत्तर बताता है कि find . -name "*.bak" -type fप्रदर्शित करता है क्या trash *.bakहटाता है। क्या वास्तव में आपका यही मतलब है? आप निर्देशिकाओं को ट्रैश के साथ स्थानांतरित कर सकते हैं trashया gvfs-trash, लेकिन trash *.bakकेवल उन फ़ाइलों और निर्देशिकाओं को स्थानांतरित करेंगे जिनके नाम के साथ समाप्त होता है .bakऔर जो वर्तमान निर्देशिका में तुरंत निवास करते हैं। शेल का विस्तार होता है *.bak, इसलिए उप-प्रकारों में फ़ाइलों को trash *.bakप्रभावित नहीं करेगा .bakजो स्वयं का नाम नहीं है .bak
एलियाह कगन

1
@ don.joey हां ls *.bak(जो मुझे लगता है कि आप का मतलब है) सूचीबद्ध करता है कि कौन सी trash *.bakकमी है। find . -name '*.bak' -xtype f -exec trash {} +सभी .bakफ़ाइलों को कहीं भी मिटा देता है .। यह एक उपनाम का उपयोग नहीं कर सकता है, इसलिए इसके बजाय स्थापित करें trash-cliया लिखें gvfs-trashयहाँ एक उदाहरण है। -xtype fफ़ाइलों का चयन करता है और फ़ाइलों के लिए सहानुभूति रखता है, लेकिन फ़ोल्डर नहीं। .bak फ़ोल्डरों को भी हटाने के लिए , उपयोग करें find . -name '*.bak' -execdir trash {} +, जो निर्देशिका के अंदर फ़ाइलों के cannot trash non existentलिए त्रुटियों से बचा जाता है । कृपया अपने उत्तर में इसका उपयोग करने के लिए स्वतंत्र महसूस करें। .bak.bak
एलियाह कगन

5

यदि आप एक निश्चित प्रकार की सभी फ़ाइलों को हटाना चाहते हैं, लेकिन वर्तमान फ़ोल्डर से केवल 1 फ़ोल्डर "गहरा":

find . -maxdepth 2 -name "*.log" -type f -delete

-maxdepth 2 क्योंकि वर्तमान निर्देशिका " " पहले फ़ोल्डर के रूप में गिना जाता है।


1

शीघ्र जवाब:

  • माना नाम या पोस्टफ़िक्स के साथ सभी फ़ाइलों को हटा दें:

    find . -name '*.pyc' -type f -delete

  • हटाए गए नाम के साथ सभी निर्देशिकाओं को हटा दें:

    find ~ -path '*/__pycache__/*' -delete‍‍‍
    find ~ -type d -name '__pycache__' -empty -delete‍‍‍
    

    थोड़ा कम कसकर नियंत्रित, लेकिन एक लाइन में:

    find ~ -path '*/__pycache__*' -delete
    

[ नोट ]:

dनिर्देशिका विकल्प है और fफ़ाइल विकल्प है।


0

यदि आप गिट रेपो के अंदर हैं, तो आप इसका उपयोग कर सकते हैं:

git clean -fdx

यह .itignore में अनियोजित फ़ाइलों और फ़ाइलों को हटा देता है।

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