อะไร. ?? * หมายถึงคำสั่ง shell?


22

ต่อไปนี้คำสั่งจะtarทุกคน "จุด" ไฟล์และโฟลเดอร์:

tar -zcvf dotfiles.tar.gz .??*

ผมคุ้นเคยกับการแสดงออกปกติ.??*แต่ฉันไม่เข้าใจวิธีการตีความ ฉันดำเนินการls .??*และtree .??*ดูไฟล์ที่อยู่ในรายการ เหตุใดนิพจน์ทั่วไปนี้จึงรวมไฟล์ทั้งหมดภายในโฟลเดอร์ที่ขึ้นต้นด้วย.ตัวอย่าง


คำตอบ:


32

Globsไม่ใช่การแสดงออกปกติ โดยทั่วไปแล้วเชลล์จะพยายามตีความสิ่งใดก็ตามที่คุณพิมพ์บนบรรทัดคำสั่งที่คุณไม่ได้อ้างอิงว่าเป็นแบบกลม Shells ไม่จำเป็นต้องสนับสนุนการแสดงออกปกติเลย (แม้ว่าในความเป็นจริงแล้วคนจำนวนมากที่ทันสมัยกว่าจะทำเช่น e กรัม=~regex match operator ในbash [[โครงสร้าง)

.??*เป็น glob มันตรงกับชื่อไฟล์ใด ๆ ที่ขึ้นต้นด้วยจุดตัวอักษร.ตามด้วยสอง (ไม่จำเป็นต้องเหมือนกัน) ตัวอักษรใด ๆ??ตามด้วยเทียบเท่าแสดงออกปกติ[^/]*คือ 0 /หรือมากกว่าตัวอักษรที่ไม่ได้

สำหรับรายละเอียดของการขยายตัวเปลือกชื่อพา ธ (ชื่อเต็มสำหรับ "globbing") ดูข้อมูลจำเพาะ POSIX


10
จุดเพิ่มเติม: นี่คือความพยายามในการเขียนแบบกลมซึ่งตรงกับ dotfiles ทั้งหมดในไดเรกทอรียกเว้นรายการพิเศษ.และ..ซึ่งปกติไม่ต้องการทำอะไรด้วย มันค่อนข้างไม่ถูกต้อง มันไม่รับสิ่งที่ชื่อว่า ' .X' โดยที่ X เป็นตัวละครอื่นที่ไม่ใช่จุด ฉันไม่คิดว่ามันเป็นไปได้ที่จะเขียน glob เดียวที่ตรงกับทุก dotfile ยกเว้น.และ..แต่คุณสามารถทำได้ด้วยสอง: tar zcvf dotfiles.tar.gz .[!.] .??*ตัวอย่างเช่น
zwol

@ แซค: ขอบคุณสำหรับการชี้แจง ฉันโพสต์ความคิดเห็นเกี่ยวกับเรื่องนั้น แต่แล้วก็ลบมัน ls .?กลับมาเช่นเดียวกับls ..ซึ่งหมายความว่าไม่มีรายการอื่น ๆ .?ในโฟลเดอร์ที่ตรงกับรูปแบบ ผมจะทำ.[^.]ทุก.?ไฟล์อื่น ๆ ..กว่า
SabreWolfy

2
@SabreWolfy ถ้าคุณอ่านข้อมูล POSIX อย่างรอบคอบนั่นเป็นความแตกต่างที่สำคัญระหว่าง globs และ regex: ในการแสดงออกวงเล็บ[^abc]ในไวยากรณ์ synex หมายถึงเช่นเดียวกับ[!abc]ในไวยากรณ์ glob (เช่น^ถูกแทนที่ด้วย!globs) การใช้[^abc]ไวยากรณ์สไตล์ในแบบกลมไม่ได้พกพาได้มากนักเนื่องจาก POSIX ไม่ได้ระบุความหมายดังนั้นเชลล์บางตัวตีความโดยใช้ซีแมนทิกส์แบบ regex ในขณะที่บางคน^ถือเป็นตัวอักษร
jw013

1
@ jw013: ขอบคุณสำหรับรายละเอียด ฉันต้องจำไว้ว่า glob! = regexp :)
SabreWolfy

1
มันเพิ่งเกิดขึ้นกับฉันที่.[!.]อาจเหลือเป็นตัวอักษรในtarบรรทัดคำสั่งในกรณีทั่วไปที่ไม่มีไฟล์ที่ตรงกับรูปแบบนั้น เชลล์บางตัวให้คุณควบคุมพฤติกรรมนั้นเช่นกับ bash shopt -s nullglobจะทำให้มันหายไปจากบรรทัดคำสั่งหากมันไม่ตรงกับสิ่งใด แต่นั่นไม่ใช่คุณสมบัติสากล
zwol

8

.??*ตัวแทน ( ไม่แสดงออกปกติแม้ว่ามันจะมีลักษณะวิธีการที่) แปลเป็นชื่อไฟล์ที่ขึ้นต้นด้วยจุด ( .) ตามด้วยตัวอักษรเดียวสอง ( ??) แล้วจำนวนใด ๆ (ศูนย์หรือมากกว่า) ของตัวละครอื่น ๆ ( *)

บางทีหน้านี้ในWildcards ในชื่อไฟล์อาจมีประโยชน์


-1

เพื่อเพิ่มคำตอบอื่น ๆ หนึ่ง?จะแปลเป็นชื่อไฟล์ตัวละครเดียวและ??จะตรงกับชื่อไฟล์ที่มีเพียงสองตัวอักษรเป็นต้น

[root@mercy testdir_2]# ls
ion  it  r
[root@mercy  testdir_2]# ls ?
r
[root@mercy  testdir_2]# ls ??
it
[root@mercy 1 testdir_2]# ls ???
ion
[root@mercy  testdir_2]#

Downvoter คุณช่วยแสดงความคิดเห็นได้ไหม? ยินดีที่จะได้รับการแก้ไขถ้าฉันผิด
Sree

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