สัญลักษณ์ *. * ถูกเรียกว่าอะไร?


คำตอบ:


20

การตีความ*.*ภายใต้ระบบ Windows / DOS แบบเก่า

ความสำคัญที่นี่เกี่ยวข้องกับ Windows / DOS มากกว่า Unix / Linux ในระบบปฏิบัติการ Windows / DOS เก่ามันเป็นรูปแบบ 'ไวด์การ์ด' รูปแบบสัญลักษณ์แทนถูกใช้สำหรับการจับคู่ชื่อไฟล์ในลักษณะที่คล้ายคลึงกับ Unix globs *.*สัญลักษณ์แทนถูกนำมาใช้กันทั่วไปเพื่อให้ตรงกับไฟล์ใด ๆ

เช่นเดียวกับ Unix glob, *จะจับคู่ลำดับของตัวละครในชื่อไฟล์, เช่นนั้น*จะจับคู่กับไฟล์ใด ๆ อย่างไรก็ตามเหตุผลที่*.*จะจับคู่ชื่อไฟล์ใด ๆ ก็เป็นเพราะความแตกต่างในวิธีการทำงานของสัญลักษณ์ตัวแทนเหล่านี้ ตามบทความนี้ :

อักขระใด ๆ ที่นอกเหนือจากจุดที่อยู่หลังเครื่องหมายดอกจันจะไม่มีผลกระทบใด ๆ เนื่องจากเครื่องหมายดอกจันจะเลื่อนเคอร์เซอร์ไปที่ตำแหน่ง 12 ซึ่งไม่มีสิ่งใดเปลี่ยนแปลงสถานะการแยกวิเคราะห์ยกเว้นจุดซึ่งจะล้างตำแหน่งสามตำแหน่งสุดท้ายและย้ายเคอร์เซอร์

พฤติกรรมนี้ (ค่อนข้างแปลกจากเปอร์สเปคทีฟของ Unix) หมายความว่าจุดที่ตามหลัง a *ไม่ตรงกับจุดจริง ๆ แต่เป็นเพียงวิธีการแฮ็ก ซึ่งหมายความว่าการเพิ่มอีก*จะตรงกับสิ่งใดในสามตำแหน่งสุดท้าย

นี้จะทำให้ความรู้สึกเล็ก ๆ น้อย ๆ เมื่อคุณพิจารณาว่าไวยากรณ์ที่ถูกนำมาใช้ใน DOS และ Windows ระบบเก่าก่อนที่ Windows 95 ซึ่งจำเป็นต้อง8.3 ชื่อไฟล์ ชื่อไฟล์เหล่านี้อนุญาตให้มีหนึ่งจุดเท่านั้นและมีความยาวไม่เกินสามตัวอักษรต่อจากจุด ส่วนใหญ่ถ้าไม่ใช่ไฟล์ทั้งหมดในระบบจะมีนามสกุลตัวอักษรสามตัว (แม้ว่าในทางเทคนิคจะอนุญาตให้มีนามสกุลสั้นลงหรือไม่มีเลยก็ได้) ดังนั้นฉันคิดว่ามันเหมาะสมที่จะใช้*.*เพื่อจับคู่ไฟล์ใด ๆ (อย่างน้อยจากมุมมองตรรกะ Windowsey )

การตีความของ*.*ใน Unix shells

ใน Unix shells, อย่างที่คนอื่น ๆ ชี้, นี่แสดงถึง 'การขยายชื่อพา ธ ' หรือ 'glob' สิ่ง*นี้ไม่มีการกระโดดที่ผิดปกติไปสู่พฤติกรรมที่สิ้นสุดและดังนั้นจึงไม่นำไปสู่ตัวละครหลังจากถูกละเว้น *.*รูปแบบจะตรงกับชื่อไฟล์ใด ๆ ที่มีจุด (ยกเว้นที่จุดเริ่มต้น) สิ่งนี้จะไม่ตรงกับไฟล์ใด ๆ เนื่องจากมีไฟล์จำนวนมากในระบบ Unix / Linux ที่ไม่มีนามสกุล (หรือมีจุดเป็นอย่างอื่นเนื่องจากอนุญาตเช่นนี้)

สาเหตุของการ*.*ไม่จับคู่จุดที่จุดเริ่มต้นของชื่อไฟล์บน Unix นั้นเนื่องมาจากการใส่จุดที่จุดเริ่มต้นคือการที่ไฟล์นั้น 'ซ่อน' และไฟล์ที่ซ่อนอยู่ถูกแยกออกจาก globs โดยค่าเริ่มต้น เพื่อให้ตรงกับพวกเขาในเปลือก POSIX จุดจะต้องมีการวางอย่างชัดเจนที่จุดเริ่มต้นของรูปแบบ ในตัวเลือกเปลือกสามารถตั้งค่าหรือตัวแปรที่สามารถตั้งค่าที่เหมาะสม แต่นี้เป็นคำถามอื่น!bashdotglobGLOBIGNORE


1
ควรสังเกตว่าเวอร์ชัน Windows ปัจจุบันดูเหมือนจะทำงานได้อย่างมีเหตุผลมากกว่า โดยเฉพาะอย่างยิ่ง "อักขระใด ๆ นอกเหนือจากจุดที่มาจากเครื่องหมายดอกจันไม่มีผล" ไม่เป็นความจริงอีกต่อไป อย่างน้อยเมื่อกรองไฟล์ในกล่องโต้ตอบOpen Fileมาตรฐานบน Windows 7 ตามรูปแบบ*7.*ให้รับไฟล์ทั้งหมดที่มีอักขระตัวสุดท้ายก่อนที่นามสกุลจะเป็น a 7และด้วย*sa*ฉันจะได้รับไฟล์ทั้งหมดที่มีสตริงย่อยsaที่ใดก็ได้ในชื่อไฟล์นั้นเป็นต้น (ดังนั้นบทความที่คุณกล่าวถึงเป็นเรื่องวิธีทำสัญลักษณ์ทำงานใน MS-DOS ? (เน้นเพิ่มด้วยตัวเอง).)
หรือ Mapper

1
@ORMapper อัปเดตส่วนหัวเพื่อแสดงถึงสิ่งนี้ พฤติกรรมนี้เป็น Windows 95 ล่วงหน้าซึ่งอยู่ในคำตอบ (แม้ว่าส่วนหัวนั้นทำให้เข้าใจผิด)
แกรม

11

มันglobอยู่ในทุบตีด้านล่างฉันได้ยกมาจากคู่มือทุบตี:

bash - GNU Bourne-Again SHell

*

จับคู่สตริงใด ๆ รวมถึงสตริง null เมื่อเปิดใช้งานตัวเลือกเชลล์ globstar และ*ใช้ในบริบทการขยายชื่อพา ธ การใช้สองแบบที่อยู่ติดกัน*sเป็นรูปแบบเดียวจะจับคู่ไฟล์ทั้งหมดและไดเรกทอรีหรือไดเรกทอรีย่อยหรือไดเรกทอรีย่อย หากตามด้วย a /, สองรายการที่อยู่ติดกัน*sจะจับคู่เฉพาะไดเรกทอรีและไดเรกทอรีย่อย

ในกรณีนี้ให้*.*จับคู่ไฟล์ใด ๆ ที่มีจุด.ในชื่อ

ท่านสามารถดูรายละเอียดเพิ่มเติมที่นี่


8

เครื่องหมายดอกจัน*เป็นglobภาษาของเชลล์ การอ้างอิงจากภาษาคำสั่งของเชลล์ :

เครื่องหมายดอกจัน ( '*') เป็นรูปแบบที่จะจับคู่สตริงใด ๆ รวมถึงสตริงว่าง

อย่างไรก็ตามจะไม่ตรงกับชื่อไฟล์ที่ขึ้นต้นด้วย a .ยกเว้นว่าdotglobตั้งค่าตัวเลือกเชลล์ไว้

เมื่อคุณใช้*.*มันจะจับคู่อะไรก็ได้ที่:

  • ไม่ได้เริ่มต้นด้วย .
  • มีอย่างน้อยหนึ่ง .

คุณอาจต้องการอ้างอิงการขยายชื่อไฟล์ในคู่มือ


6

ผู้คนจำนวนมากที่มาจาก Windows คิดว่า*.*มีไว้สำหรับไฟล์ทั้งหมด บน Windows มันเป็น บน UNIX มันเป็นไฟล์ทั้งหมดที่มีอย่างน้อย 1 จุดในชื่อของพวกเขา *ทำงานด้วยตัวเองได้ดีใน Windows (ย้อนกลับไปสู่ช่วงต้นของ DOS); อย่างไรก็ตามตำราเก่าที่ตีพิมพ์*.*และดูเหมือนว่าจะเป็นนิสัยที่ยากที่จะทำลาย


4

*เป็นสัญลักษณ์แทนที่เชลล์ใช้เพื่อทำการขยายชื่อไฟล์หรือที่เรียกว่า "globbing" *ขยายไปสู่สิ่งใดรวมถึงไม่มีสิ่งใด (เช่น*.*จะจับคู่file.ฯลฯ ) ไวด์การ์ดทั่วไปอื่น ๆ คือ?ซึ่งตรงกับอักขระเดี่ยวใด ๆ

อย่าสับสนฟังก์ชั่นของสัญลักษณ์ตัวแทนเหล่านี้ด้วยการใช้ตัวอักษรเดียวกันในการแสดงออกปกติ (เช่นที่ใช้กับ grep)


3

นั่นคือstar-dot-star - อย่างน้อยในโลก DOS (และหลังจากนั้นแน่นอน Windows) ในดอทจุด.มีความหมายวิเศษพิเศษเนื่องจากชื่อไฟล์เป็นฐานแปดตัวอักษร (ขยายในภายหลัง แต่ขออยู่โรงเรียนเก่า) และนามสกุลสามตัวอักษร (ซึ่งกำหนดประเภทไฟล์) ใน Unix ชนิดของไฟล์มักจะถูกกำหนดโดยสองไบต์แรกของไฟล์ (หรือเวทย์มนตร์อื่น ๆ ) และส่วนขยายนั้นเป็นข้อมูล แต่ไม่มีความหมายมากนัก ยกเว้นเมื่อสิ่งนี้ได้รับความเบลอทั้งหมด

ดังนั้นใน Unix จึงไม่มีความหมายพิเศษ เครื่องหมายดอกจันเป็นอักขระ "globbing" ใน Unix shells และเป็น wildcard สำหรับจำนวนอักขระใด ๆ (รวมถึงศูนย์) ?เป็นอีกตัวอักษรกลมทั่วไปที่ตรงกับหนึ่งในตัวละครใด ๆ

*.*ตรงกับชื่อไฟล์ใด ๆ .ที่มีอย่างน้อยหนึ่ง แต่ไม่ได้มีชื่อพิเศษหรือความหมายใด ๆ มากกว่าหรือ*a* *_*และ*.?จะจับคู่ไฟล์ใด ๆ กับจุดหนึ่งตัวตรงหลังจากจุดนั้น นอกจากนี้ยังมีรูปแบบการขยายแบบวงกลมที่ซับซ้อนมากขึ้น - ดูหน้าเปลือกของคุณ

"พจนานุกรมแฮ็กเกอร์ใหม่" (การขยายตัวของไฟล์ "ศัพท์แสง" MIT) บันทึกว่า "ดาว" เป็นชื่อที่พบบ่อยที่สุดสำหรับ*สัญลักษณ์ (ตามด้วยsplat) และฉันคิดว่ามันยังคงเป็นจริงในทางปฏิบัติและ.เป็นเรื่องปกติ " จุด "ดังนั้นแม้ว่ามันจะไม่มีความหมายพิเศษใด ๆ ภายในเป็นสัญลักษณ์ของกลุ่ม บริษัท ลำดับยังคงเรียกว่าstar-dot-starบนยูนิกซ์ (มันมีประโยชน์น้อยกว่า)


อาจฟังดูแปลก แต่ขอบคุณที่พูดถึง "star dot star" นี่เป็นสิ่งที่ทำให้หน้านี้เป็น googleable!
คะแนน _ ต่ำกว่า

3

ที่นี่มีจริง 2 สัญลักษณ์เครื่องหมายดอกจันและจุด* .โดยปกติแล้วเชลล์จะตีความเฉพาะเครื่องหมายดอกจันเป็นตัวอักษรใด ๆ แต่ใน regex มันจะหมายถึงรูปวงกลมโลภ ในกรณีนี้มันจะจับคู่สิ่งที่ไม่สิ้นสุดหรือเริ่มต้นด้วยจุด แต่มีอย่างน้อยหนึ่งรายการ:

somefile.dot # match
.dot.between.words. # match
.onlydotatstart # don't match
onlydotatend. # match
.startandenddot. # don't match

1
onlydotatend.กรณีของคุณคือการจับคู่แน่นอน?
แกรม

@ Graeme nope touch 'onlydotatend.' && echo *.*ไม่ได้คืน
Braiam

1
ทำเพื่อฉัน! ทั้งในและbash dashคุณใช้เปลือกอะไร
แกรม

@ Graeme zsh และคุณทุบตีถูกต้องไม่ได้
Braiam

ฉันเพิ่งลองสิ่งนี้ในการzshกำหนดค่าวานิลลาและมันก็ใช้ได้เหมือนกัน ฉันไม่เข้าใจวิธีonlydotatend.การจับคู่ไม่ได้มีตัวเลือกการกำหนดค่าที่ทำเช่นนี้หรือไม่
แกรม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.