Rm * (1) * एक डायरेक्टरी की सभी फाइलों को क्यों हटाता है?


47

मुझे उसकी उम्मीद थी:

$ rm *(1)*

(1)नाम वाली सभी फ़ाइलों को हटा देगा । मैं गलत था। इसने डायरेक्टरी की सभी फाइलों को हटा दिया।

क्यों?


5
जब भी मैं rmएक पैटर्न के साथ उपयोग करता हूं , मैं हमेशा echoवास्तविक कमांड जारी करने से पहले इसे पसंद करता हूं । आदत ने मुझे एक से अधिक बार बचाया (जब से, 6 साल या उससे अधिक के रूप में, के बीच अंतर को भ्रमित करते हुए ) DEL A: *.*और DEL *.* A:
गेरिट

जवाबों:


51

से man bash:

*(pattern-list)
                 Matches zero or more occurrences of the given patterns

आपके पास एक ग्लोब अभिव्यक्ति है जो शून्य या अधिक 1एस के साथ शुरू होने वाली फाइलों से मेल खाती है - जो सभी फाइलें हैं।

इस निराशाजनक व्यवहार को अक्षम करने का एक सरल तरीका है \, कोष्ठकों से बचना:

rm *\(1\)*

अन्यथा आप shopt -u extglobव्यवहार को अक्षम करने और shopt -s extglobइसे फिर से सक्षम करने के लिए उपयोग कर सकते हैं :

shopt -u extglob
rm *(1)*
shopt -s extglob

ध्यान दें कि जैसा कि स्टीफन कहते हैं , extglobसक्षम bash-completionकरने से यह पूरा होने के कारण कार्य ठीक से काम नहीं कर सकते हैं।


7
ध्यान दें कि extglobडिफ़ॉल्ट रूप से चालू नहीं है, लेकिन यदि आपने इसे स्थापित और सक्षम किया है तो bash_completion द्वारा चालू किया गया है। bashजैसे विकल्पों के लिए स्थानीय गुंजाइश नहीं zshहै।
स्टीफन चेज़लस

1
यह भी ध्यान दें कि bash-4.3इसमें एक प्रतिगमन है जो *(1)*छिपी हुई फ़ाइलों को भी विस्तारित करता है।
स्टीफन चेज़लस

@StephaneChazelas क्या आपके पास उस प्रतिगमन से संबंधित बग के लिए लिंक है? साभार
बेसिक

2
@ बासिक, यहाँ तुम जाओ । Chet ने अभी तक उत्तर नहीं दिया है।
स्टीफन चेज़लस

9

यह संभवतः extglobशेल विकल्प से संबंधित है । यदि मैं इसे बंद कर देता हूं, तो पैटर्न एक त्रुटि संदेश उत्पन्न करता है:

martin@dogmeat:~$ shopt -u extglob
martin@dogmeat:~$ shopt extglob
extglob         off
martin@dogmeat:~$ echo *(1)*
bash: syntax error near unexpected token `('

अगर मैं इसे चालू करता हूं, तो यह वास्तव में सब कुछ मेल खाता है। मैनपेज इन पैटर्न को दस्तावेजित करता है, मुझे लगता है कि वे संबंधित हैं:

   If the extglob shell option is enabled using the shopt builtin, several
   extended  pattern  matching operators are recognized.  In the following
   description, a pattern-list is a list of one or more patterns separated
   by a |.  Composite patterns may be formed using one or more of the fol
   lowing sub-patterns:

          ?(pattern-list)
                 Matches zero or one occurrence of the given patterns
          *(pattern-list)
                 Matches zero or more occurrences of the given patterns
          +(pattern-list)
                 Matches one or more occurrences of the given patterns
          @(pattern-list)
                 Matches one of the given patterns
          !(pattern-list)
                 Matches anything except one of the given patterns

मुझे ऐसा कोई दस्तावेज नहीं दिखता है जो यह बताए कि एक प्रमुख चरित्र के बिना कोष्ठक क्या निर्दिष्ट करता है। वैसे भी, आप परेंस को उद्धृत करके इस मुद्दे को दरकिनार कर सकते हैं:

martin@dogmeat ~ % echo *\(1\)*
A(1)b

इसके अलावा, अपने पैटर्न का परीक्षण करने के लिए उपयोग करें echoया lsयदि आप पूरी तरह से सुनिश्चित नहीं हैं कि यह काम कर रहा है :)


FYI करें: {एक ब्रेस है, (एक परन (या गोल ब्रैकेट) है।
मिकेल

आह, धन्यवाद। मैं एक देशी अंग्रेजी वक्ता नहीं हूं इसलिए मैं उन्हें भ्रमित करता हूं :)
मार्टिन वॉन विटिच

6
ब्रिटिश में: {= घुंघराले ब्रैकेट, (= गोल ब्रैकेट, [= स्क्वायर ब्रैकेट। अमेरिकी में: {= ब्रेस, (= पैरेन, [= ब्रैकेट। थोड़ा सा भ्रमित। यदि आपको कभी यह जांचने की आवश्यकता है कि कुछ क्या कहा जाता है, तो जरगॉन फाइल - ASCII काफी मददगार है।
मिकेल

4
@ मिकेल थैंक्स, मैंने भी यहां चेक किया था इसलिए अब मैं फूल कोष्ठक और गिलहरी के बारे में जानता हूं !

भारतीय अंग्रेजी में, {एक फूल ब्रैकेट है, [एक वर्ग ब्रैकेट है, और (एक गोल ब्रैकेट या अधिक सामान्यतः सिर्फ ब्रैकेट है। :-)
श्रीवत्सआर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.