ฉันคาดว่า:
$ 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:
)