rm -rf सभी फ़ाइलों और सभी छुपी हुई फ़ाइलों के बिना। & .. त्रुटि


82

rm -rf /some/path/* उस dir (और subdirs) में सभी गैर-छिपी हुई फ़ाइलों को हटा देता है।

rm -rf /some/path/.* उस dir में सभी छिपी हुई फ़ाइलों को हटा देता है (लेकिन उप-वार नहीं) और निम्नलिखित त्रुटि / चेतावनी भी देता है:

rm: cannot remove directory: `/some/dir/.'
rm: cannot remove directory: `/some/dir/..'

के बारे में चेतावनी / त्रुटि प्राप्त किए बिना सभी छिपा और गैर छिपा फ़ाइलों और फ़ोल्डरों रिकर्सिवली लक्ष्य निर्देशिका में दूर करने के लिए उचित तरीका क्या है .और ..?

जवाबों:


39

आप हमेशा त्रुटि संदेश भेज सकते हैं /dev/null

rm -rf /some/path/.* 2> /dev/null

आप भी कर सकते हैं

rm -rf /some/path/
mkdir /some/path/

... तो आपको पहली जगह में छिपी हुई फाइलों से परेशान नहीं होना पड़ेगा।


2
लेकिन क्या होगा अगर मैं केवल छिपी हुई फ़ाइलों को हटाना चाहता हूं?
CMCDragonkai

@CMCDragonkai जो एक अलग प्रश्न होना चाहिए, लेकिन आप गाइल्स के उत्तर में समाधान पा सकते हैं ( rm ..?* .[!.]*इसे करना चाहिए)।
evilsoup

15
निर्देशिका को हटाना और पुन: निर्मित नहीं करना जोखिम को बढ़ाता है कि फ़ाइल अनुमति बाद में सही नहीं है (विशेष रूप से सर्वर वातावरण में महत्वपूर्ण)। स्वचालित रूप से पहले की तरह अनुमतियों वाला फ़ोल्डर कौन बना सकता है?
यो लुडके

1
@YoLudke आप बिल्कुल सही हैं, कई स्थितियों में यह कोई फर्क नहीं पड़ता है, लेकिन फ़ोल्डर को हटाना और पुनःप्रचार करना उस फ़ोल्डर को खाली करने के लिए शब्दार्थ के बराबर नहीं है; ऐसा करने में सावधान रहें!
थॉमस

निर्देशिका को हटाना हमेशा संभव नहीं होता है। मेरे मामले में डायरेक्टरी एक डॉक्यूमेन्ट वॉल्यूम है, और जब मैं वॉल्यूम के अंदर जो कुछ भी कर सकता हूं, कर सकता हूं, तो मैं कंटेनर के भीतर से ही वॉल्यूम को बदल सकता हूं।
dovidweisz

85

*सभी गैर-डॉट-फ़ाइलों से .[!.]*मेल खाता है , सिवाय सभी डॉट फ़ाइलों से मेल खाता है .और उन फ़ाइलों को जिनके नाम से शुरू होता है .., और ..?*छोड़कर सभी डॉट-डॉट फ़ाइलों से मेल खाता है ..। साथ में वे .और के अलावा सभी फ़ाइलों से मेल खाते हैं ..। यदि इन तीनों में से कोई भी पैटर्न कुछ भी मेल नहीं खाता है, तो यह अपने आप फैलता है; rm -fगैर-मौजूद तर्कों की परवाह नहीं करता है, इसलिए यह कोई फर्क नहीं पड़ता।

rm -rf ..?* .[!.]* *

आप भी इस्तेमाल कर सकते हैं find। यह अधिक जटिल है, लेकिन काम करने का लाभ तब भी है जब इतनी सारी फाइलें हैं कि ऊपर दिए गए वाइल्डकार्ड आपके सिस्टम के कमांड पथ की सीमा से अधिक विस्तारित होंगे।

find . -name . -o -prune -exec rm -rf -- {} +

आपको निर्देशिका को निकालना और पुनः बनाना स्पष्ट हो सकता है। इसका लाभ (या नकारात्मक रूप से, जैसा कि मामला हो सकता है) के परिणामस्वरूप रिक्त निर्देशिका में होता है, भले ही कोई अन्य प्रोग्राम समवर्ती निर्देशिका में फ़ाइलें बना रहा हो।


8
यह स्वीकृत उत्तर होना चाहिए, क्योंकि यह माता-पिता के ट्रैवर्सल और संभावित विलोपन को रोकता है।
राबेलमी

findविकल्प "सफलता" भले ही कुछ फ़ाइल सफलतापूर्वक नष्ट कर दिया नहीं है देता है; स्क्रिप्ट के लिए अच्छा नहीं है।
फ्रैंकलिन यू

अपने दूसरे findआदेश के संबंध में , "स्टेट्स-ऑफ़-डेट का अर्थ है -Depth का पता लगाने के लिए, आप उपयोगी -प्रयोग और -delete को एक साथ उपयोग नहीं कर सकते हैं।" - फिर भी आप उपयोग करते हैं -prune -delete?
डॉकटोर जे

@DoktorJ वास्तव में, -pruneयहाँ कुछ भी नहीं करता है। और वापस पढ़ने पर मैं देखता हूं कि मैंने प्रश्न का सही उत्तर नहीं दिया: मैंने ध्यान दिया कि पुनरावृत्ति न हो, लेकिन प्रश्न स्पष्ट रूप से पुनरावर्ती हटाने के लिए कहता है। मैंने अपना उत्तर ठीक कर लिया है।
गिल्स

2
@haylem zsh में, आपको इतिहास प्रतिस्थापन सक्षम होने के .[^.]*बजाय लिखने की आवश्यकता .[!.]*है (जो डिफ़ॉल्ट रूप से संवादात्मक है, लेकिन स्क्रिप्ट में नहीं), क्योंकि zsh !इतिहास के संदर्भ के रूप में पार्स करता है। लेकिन zsh में आपको यह नहीं चाहिए कि पहली जगह में, आप वाइल्डकार्ड मैच *(D)में डॉट फाइलें (बिना .या ..) शामिल करने के लिए उपयोग कर सकते हैं ।
गाइल्स

21

बस एहसास हुआ कि अधिकांश लिनक्स डिस्ट्रोस में यह सबसे सुविधाजनक तरीका है:

ls -A1 | xargs rm -rf

कहाँ पे

-A= सूची को छोड़कर सब कुछ .और..

-1 = प्रत्येक वस्तु को एक पंक्ति में रखें


4
नीचे जो मैं देख रहा हूं वह यह है: आपको ऐसा करने के लिए निर्देशिका में 'सीडी' की आवश्यकता है।
कुमार

ls -A1 /your/path/ | xargs rm -rfआवेदन करना चाहिए
Godzillante

nope..it मदद नहीं करता है - उदाहरण के लिए: ls -A1 ~ / test / | xargs rm -rf यह कमांड उन फाइलों को डिलीट कर देती है जो मैं वर्तमान में 'cd' में हूं .. डायरेक्टरी ~ / टेस्ट में नहीं।
कुमार

5
यह काम नहीं करता है अगर किसी भी फ़ाइल नाम में रिक्त स्थान, newlines, उद्धरण या बैकस्लैश हैं।
स्टीफन चेज़लस

1
-1 उपरोक्त टिप्पणी के कारण। ।
कुछ 20

15

या तो dotglobअपने शेल के विकल्प को बदलें और उपयोग करें *, या जैसे कुछ का उपयोग करें find

find somedir -mindepth 1 -delete

2
या आप बस rm -rf /some/dirऔर फिर एक नई खाली निर्देशिका बना सकते हैं ।
ट्रिपलआई

अब तक का सबसे अच्छा विकल्प। बहुत सुरक्षित है क्योंकि आप स्पष्ट रूप से निर्देशिका पथ निर्दिष्ट करते हैं।
यानिक गिरोउद

4

यह @Gilles उत्तर की तरह ही काम करना चाहिए लेकिन अधिक कॉम्पैक्ट:

rm -rf {,.[!.],..?}*

या

rm -rf dir/to/files/{,.[!.],..?}*

ifकेवल सुरक्षित होने के लिए स्क्रिप्ट में उपयोग के लिए भी जोड़ना चाहिए :

if [ -d "$DIR" ]; then
    rm -rf ${DIR}/{,.[!.],..?}*
fi

1
विचित्र रूप से पर्याप्त, उबंटू 16.04 एलटीएस पर बैश उर्फ ​​के रूप में, पिछला जवाब काम नहीं कर रहा था। हालाँकि, alias cleandir='rm -rf {,.[!.],..?}*'करता है।
स्टीवन वेंटिमिग्लिया

3

ढूंढो अपना दोस्त

find ! -name '.' ! -name '..' -delete

% find ! -name '.' ! -name '..'
./test
./test4
./test4/.test6
./test3
./.test5
./test2
% find ! -name '.' ! -name '..' -delete    
% find ! -name '.' ! -name '..'     
%             

यदि आप अपने वर्तमान निर्देशिका ($ PWD) के बारे में कुछ और खोज करना चाहते हैं, तो findकमांड के ठीक बाद एक रास्ता जोड़ें ; जैसे, find /path ! -name '.' ! -name '..' -delete। यदि आप केवल nनिर्देशिकाओं की संख्या को कम करना चाहते हैं , तो पैरामीटर के -maxdepth nठीक बाद विकल्प का उपयोग करें /path

उपरोक्त कमांड को एक Ubuntu 13.04 सिस्टम पर परीक्षण किया गया था। अन्य, आधुनिक लिनक्स सिस्टम पर काम करने की संभावना होगी।


वर्तमान निर्देशिका की सभी निर्देशिकाओं को हटाने के लिए आपfind . ! -name '.' ! -name '..' -type d -delete
एंडी

2

चेतावनी के बारे में चेतावनी / त्रुटि प्राप्त किए बिना सभी छिपी हुई और गैर-छिपी हुई फ़ाइलों और फ़ोल्डरों को लक्ष्य निर्देशिका में हटाने का उचित तरीका क्या है। तथा ..?

मान लीजिए कि प्रश्न में निर्देशिका है ./dir, तो

rm -rf ./dir

./dirछिपी हुई फ़ाइलों और निर्देशिकाओं सहित, पुनरावर्ती रूप से और निर्देशिका सहित सभी फ़ाइलों को हटा देगा ./dir

यदि आप निर्देशिका को स्वयं हटाना नहीं चाहते हैं, तो आप इसे बाद में फिर से बना सकते हैं, या उपयोग कर सकते हैं

find ./dir -mindepth 1 -delete

या यदि आप findसमर्थन नहीं करते हैं -delete,

find ./dir -mindepth 1 -depth -exec rm -rf {} ';'

उपयोग -mindepth 1करने से आप शीर्ष-स्तरीय निर्देशिका रख सकते हैं ./dir


इसे सर्वश्रेष्ठ उत्तर के रूप में चिह्नित किया जाना चाहिए
kittChris

1

मेरा सुझाव है कि आप प्रयोग करें

टर्न- ऑन डॉट्स (छिपी फाइलें)

  • सेट dotglob

    shopt -s dotglob

टर्न- ऑफ डॉट्स

  • सेट नहीं dotglob

    shopt -u dotglob

इस विधि ने ठीक वैसे ही काम किया जैसा कि मैं एक कॉपी कमांड के लिए करना चाहता था जो छिपे निर्देशिकाओं को याद कर रहा था।

    shopt -s    dotglob
    cp    -rvn  ./$from/*  ./$too/
    shopt -u    dotglob

इसलिए मैंने एक हटाने (हटाने), और उफ़ ...

    shopt -s    dotglob
    rm -fr ../message_splitter--044a/*
    shopt -u    dotglob

... वह भी काम करता है!

यह मेरे लिए होता है कि आप प्रिय पाठक message_splitterनिर्देशिका को नहीं देख सकते । किसी भी तरह से इसमें एक .svnफ़ोल्डर होता है जिसे निकालने की आवश्यकता होती है, और इसे कॉपी किया जाता है।

से manपेज ...

dotglob यदि सेट किया जाता है, तो बैश में `के साथ शुरू होने वाले फ़ाइल नाम शामिल होते हैं। pathname विस्तार के परिणामों में।

संदर्भ:


-2

इस कोड को आज़माएं:

Dirlist=``find /some/path/ -type d -name '.[^.]*'`
for HiddenDir in $Dirlist
do
    rm -rf $HiddenDir
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.