เหตุใด rm * (1) * จึงลบไฟล์ทั้งหมดในไดเรกทอรี


47

ฉันคาดว่า:

$ rm *(1)*

จะลบไฟล์ทั้งหมดที่มี(1)อยู่ในชื่อ ฉันผิดไป. มันลบไฟล์ทั้งหมดในไดเรกทอรี

ทำไม?


5
เมื่อใดก็ตามที่ฉันใช้rmกับรูปแบบฉันมักจะนำหน้าด้วยechoก่อนที่จะออกคำสั่งจริง นิสัยช่วยฉันได้มากกว่าหนึ่งครั้ง (ตั้งแต่อายุ 6 ขวบเป็นต้นไปทำให้เกิดความสับสนระหว่างความแตกต่างDEL A: *.*และDEL *.* A:)
gerrit

คำตอบ:


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นี้
Stéphane Chazelas

1
นอกจากนี้โปรดทราบว่าbash-4.3มีการถดถอยที่*(1)*ยังขยายไฟล์ที่ซ่อนอยู่
Stéphane Chazelas

@StephaneChazelas คุณมีลิงค์สำหรับข้อผิดพลาดที่เกี่ยวข้องกับการถดถอยนั้นหรือไม่? ขอบคุณ
Basic

2
@Basic, ที่นี่คุณไป Chet ยังไม่ได้ตอบกลับ
Stéphane Chazelas

9

นี่อาจเกี่ยวข้องกับextglobตัวเลือกเชลล์ หากฉันปิดมันรูปแบบจะสร้างข้อความแสดงข้อผิดพลาด:

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

หากฉันเปิดใช้งานดูเหมือนว่าจะเข้ากันได้ทุกอย่าง manpage จัดทำเอกสารรูปแบบเหล่านี้ฉันคิดว่าพวกมันเกี่ยวข้องกัน:

   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

ฉันไม่เห็นเอกสารใด ๆ ที่ระบุว่าวงเล็บใดที่ไม่มีตัวอักษรนำ อย่างไรก็ตามคุณสามารถหลีกเลี่ยงปัญหานี้ได้โดยการอ้างถึง parens:

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

ใช้echoหรือlsทดสอบรูปแบบของคุณก่อนถ้าคุณไม่แน่ใจว่ามันใช้งานได้จริง :)


FYI: {คือวงเล็บปีกกา(คือ paren (หรือวงเล็บเหลี่ยม)
Mikel

อ่าขอบคุณ ฉันไม่ได้พูดภาษาอังกฤษดังนั้นผมจึงมีแนวโน้มที่จะสับสนได้ :)
มาร์ตินฟอน Wittich

6
ในอังกฤษ: {= วงเล็บปีกกา(= วงเล็บเหลี่ยม[= วงเล็บเหลี่ยม ในอเมริกา: {= brace, (= paren, [= bracket สับสนเล็กน้อย หากคุณต้องการตรวจสอบสิ่งที่เรียกว่าไฟล์ Jargon - ASCIIมีประโยชน์มาก
Mikel

4
@ Mikel ขอบคุณฉันได้ตรวจสอบที่นี่ดังนั้นตอนนี้ฉันรู้เกี่ยวกับวงเล็บดอกไม้และกระรอก !

ในภาษาอังกฤษแบบอินเดีย{นั้นเป็นวงเล็บดอกไม้[เป็นวงเล็บเหลี่ยมและ(เป็นวงเล็บเหลี่ยมหรือมากกว่าปกติเพียงวงเล็บ :-)
ShreevatsaR
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.