मुझे उसकी उम्मीद थी:
$ rm *(1)*
(1)
नाम वाली सभी फ़ाइलों को हटा देगा । मैं गलत था। इसने डायरेक्टरी की सभी फाइलों को हटा दिया।
क्यों?
मुझे उसकी उम्मीद थी:
$ rm *(1)*
(1)
नाम वाली सभी फ़ाइलों को हटा देगा । मैं गलत था। इसने डायरेक्टरी की सभी फाइलों को हटा दिया।
क्यों?
जवाबों:
से 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
करने से यह पूरा होने के कारण कार्य ठीक से काम नहीं कर सकते हैं।
extglob
डिफ़ॉल्ट रूप से चालू नहीं है, लेकिन यदि आपने इसे स्थापित और सक्षम किया है तो bash_completion द्वारा चालू किया गया है। bash
जैसे विकल्पों के लिए स्थानीय गुंजाइश नहीं zsh
है।
bash-4.3
इसमें एक प्रतिगमन है जो *(1)*
छिपी हुई फ़ाइलों को भी विस्तारित करता है।
यह संभवतः 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
यदि आप पूरी तरह से सुनिश्चित नहीं हैं कि यह काम कर रहा है :)
{
एक ब्रेस है, (
एक परन (या गोल ब्रैकेट) है।
{
= घुंघराले ब्रैकेट, (
= गोल ब्रैकेट, [
= स्क्वायर ब्रैकेट। अमेरिकी में: {
= ब्रेस, (
= पैरेन, [
= ब्रैकेट। थोड़ा सा भ्रमित। यदि आपको कभी यह जांचने की आवश्यकता है कि कुछ क्या कहा जाता है, तो जरगॉन फाइल - ASCII काफी मददगार है।
{
एक फूल ब्रैकेट है, [
एक वर्ग ब्रैकेट है, और (
एक गोल ब्रैकेट या अधिक सामान्यतः सिर्फ ब्रैकेट है। :-)
rm
एक पैटर्न के साथ उपयोग करता हूं , मैं हमेशाecho
वास्तविक कमांड जारी करने से पहले इसे पसंद करता हूं । आदत ने मुझे एक से अधिक बार बचाया (जब से, 6 साल या उससे अधिक के रूप में, के बीच अंतर को भ्रमित करते हुए )DEL A: *.*
औरDEL *.* A:
।