बैश का उपयोग करके सभी छिपी हुई फ़ाइलों और निर्देशिकाओं को कैसे हटाएं?


28

स्पष्ट समाधान 1 का निकास कोड बनाता है:

bash$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
bash$ echo $?
1

एक संभव समाधान "को छोड़ देगा।" और ".." निर्देशिका लेकिन केवल उन फ़ाइलों को हटाए जाएंगे जिनके नाम 3 वर्णों से अधिक हैं:

bash$ rm -f .??*

ठीक है अगर तुम भी नहीं हटा रहे हैं के बारे में चिंतित नहीं हैं। & .. तो कौन परवाह करता है? जब तक आप एक स्क्रिप्ट में बदसूरत आउटपुट के बारे में चिंतित नहीं होते हैं, तब मुझे लगता है कि स्पष्ट समाधान कम टाइपिंग है जो दूसरों को काफी स्पष्ट रूप से लिखता है।
मैट

बस इतना तुम जानते हो, .. और। फाइलें नहीं हैं। वे निर्देशिकाओं के संदर्भ हैं। । (सिर्फ एक बिंदु) वर्तमान निर्देशिका है, और .. (दो बिंदु) एक स्तर तक निर्देशिका की एक कड़ी है। उदाहरण के लिए, यदि cd / home / user, / होम / उपयोगकर्ता के बराबर है और .. / घर / दूसरे शब्दों में, आप हटा नहीं सकते। और .. (?)
फुजियन

टिप्पणी मैट के लिए धन्यवाद। मैं अक्सर कमांड एक्ज़िट कोड चेकिंग (सेट-ई) के साथ स्क्रिप्ट में कमांड का उपयोग करता हूं। इन मामलों में एक सांकेतिक निकास कोड आवश्यक है।
योनातन ब्रोज़ा

भीतर कुछ भी निहित नहीं है। और .. जो उन्हें rm -rf के साथ डिलीट होने से बचाता है। यह सिर्फ rm के आधुनिक रूपांतरों में जोड़ा गया एक सुरक्षा तंत्र है।
कुबंज़िक

और वहाँ हमेशा rm -rf है। * || सच है अगर आप बस उस एक बयान के लिए सेट-व्यवहार के आसपास होना चाहते हैं।
डोमिंगो इग्नासियो गैलडोस

जवाबों:


34
rm -rf। [^]। ?? * *

सभी मामलों को पकड़ना चाहिए। । ??। * केवल 3+ चरित्र फ़ाइल नाम से मेल खाएगा (जैसा कि पिछले उत्तर में समझाया गया है), [[।] किसी भी दो चरित्र प्रविष्टियों (के अलावा अन्य) को पकड़ लेगा।


जवाब के लिए धन्यवाद! इसके आधार पर मुझे "rm -rf [^]।] *" के छोटे संस्करण भी मिले।
योनातन ब्रोज़ा

4
उस छोटे संस्करण से सावधान रहें, यह समान परिणाम देगा, लेकिन समान परिणाम नहीं। यह सामने के दो बिंदुओं के साथ नामों से मेल नहीं खाएगा (जैसे "... /" जो कभी-कभी
रूटकिट्स

और पीडब्ल्यूडी की जांच करने के लिए सावधान रहें या आप अपनी सभी सेटिंग्स को ढीला कर दें :)
kommradHomer

यह काम करने के लिए प्रतीत नहीं होता है zsh। कोई सुझाव?
ryanjdillon

साथ zshडिफ़ॉल्ट रूप से एक खाली वाइल्डकार्ड मैच एक त्रुटि के रूप में व्यवहार किया जाता है; जबकि इसके साथ bashबस अपरिवर्तित है। zshउसी तरह से व्यवहार करने के लिए आप कमांड का उपयोग कर सकते हैंunsetopt nomatch
रसेल हीलिंग

1
find -path './.*' -delete

यह वर्तमान निर्देशिका की सभी फ़ाइलों से मेल खाता है जो .इनसे शुरू होता है और इन पुनरावर्ती को हटाता है। गैर-छिपी निर्देशिकाओं में छिपी हुई फ़ाइलों को छुआ नहीं गया है।

मामले में आप वास्तव में एक निर्देशिका से सब कुछ मिटा देना चाहते थे , find -deleteपर्याप्त होगा।


यह सब कुछ हटा देगा, न कि केवल उन प्रविष्टियों से शुरू होगा.
कास्परड

ओह, लगता है कि मैंने इस प्रश्न को "छिपी हुई फ़ाइलों सहित सब कुछ हटा दिया" के रूप में गलत समझा है ... ठीक है, मेरा बुरा।
फ्रिट्ज़

@kasperd धन्यवाद, अब इसे वास्तव में प्रश्न का उत्तर देना चाहिए।
फ्रिट्ज़

0

सबसे अच्छा तरीका शायद है:

  • खोजो। -iname। * -maxdepth 1 -type f -exec rm {} \;

बदलने के लिए rs को ls -l करें, यदि आप देखना चाहते हैं कि क्या डिलीट किया जाएगा, तो आउटपुट यू को वर्बोज़ करने के लिए -v विकल्प को rm में जोड़ना चाहते हैं

  • -Type f विकल्प बताता है कि केवल फाइलों को देखने के लिए कमांड ढूंढें (omit dirs, links etc)
  • -maxdepth 1 बताता मिल उप निर्देशिकाओं पर नीचे जाने के लिए नहीं

ps। '\' समाप्त करने के बारे में मत भूलना


1
सावधान! आपका मतलब है -'नाम '। *' -iname। * या फिर आप अंदर खींच लेंगे। और .. फिर भी।
डोमिंगो इग्नासियो गैलडोस

-1
ls -la | awk '$NF ~ /^\.[^.]+/  {print $NF}' | xargs rm -rf

ls -la ............. long list (all files and folders)
$NF ................ last field (file or folder name)
~   ................ Regular Expression match
/^\.[^.]+/ ......... dot followed by not dot at least once +

If the last field $NF match pattern show it and send 
it to xargs which will perform the task.

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