ฉันคาดว่า:
$ 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 `('
หากฉันเปิดใช้งานดูเหมือนว่าจะเข้ากันได้ทุกอย่าง 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ทดสอบรูปแบบของคุณก่อนถ้าคุณไม่แน่ใจว่ามันใช้งานได้จริง :)
{คือวงเล็บปีกกา(คือ paren (หรือวงเล็บเหลี่ยม)
{= วงเล็บปีกกา(= วงเล็บเหลี่ยม[= วงเล็บเหลี่ยม ในอเมริกา: {= brace, (= paren, [= bracket สับสนเล็กน้อย หากคุณต้องการตรวจสอบสิ่งที่เรียกว่าไฟล์ Jargon - ASCIIมีประโยชน์มาก
{นั้นเป็นวงเล็บดอกไม้[เป็นวงเล็บเหลี่ยมและ(เป็นวงเล็บเหลี่ยมหรือมากกว่าปกติเพียงวงเล็บ :-)
rmกับรูปแบบฉันมักจะนำหน้าด้วยechoก่อนที่จะออกคำสั่งจริง นิสัยช่วยฉันได้มากกว่าหนึ่งครั้ง (ตั้งแต่อายุ 6 ขวบเป็นต้นไปทำให้เกิดความสับสนระหว่างความแตกต่างDEL A: *.*และDEL *.* A:)