01204223/filename expansion

จาก Theory Wiki
(เปลี่ยนทางจาก 01204223/glob)
ไปยังการนำทาง ไปยังการค้นหา
เอกสารนี้ประกอบการสอนวิชา 01204223

ในการทำงานบนระบบ unix โดยผ่านทาง shell ทั่วไป เราจะได้รับการอำนวยความสะดวกหลายอย่างจาก shell สิ่งหนึ่งก็คือการใช้งานแพทเทิร์นเพื่อระบุชื่อไฟล์ ทั้งหมดนี้อยู่ในสิ่งที่เราเรียกว่า word expansion (หรือ word substitution)

ลักษณะของ word expansion ที่ shell ทำให้นั้น จะเป็นการขยายคำสั่งที่เราพิมพ์เข้าไป พิจารณาตัวอย่างของคำสั่ง echo เมื่อเรียกในไดเร็กทอรีที่มีไฟล์ test.c และ hello.c

$ echo hello world
hello world
$ echo hello world *.c
hello world test.c hello.c

shell จะขยายแพทเทิร์น *.c ด้วยไฟล์ที่ตรงกับที่แพทเทิร์นนั้นระบุ

แพทเทิร์นแบบ glob

แพทเทิร์นที่ใช้ระบุชื่อไฟล์บนยูนิกซ์เชลล์นั้นเรียกว่า glob pattern ซึ่งมีรูปแบบการใช้งานที่ง่ายกว่าแพทเทิร์นแบบนิจน์เรกูลาร์ (regular expression) ดังที่ใช้ในคำสั่งประเภท grep แพทเทิร์นแบบ glob สามารถประกอบไปด้วยอักขระพิเศษต่อไปนี้

  • * --- จะแทนสตริงใด ๆ รวมถึงสตริงว่าง
  • ? --- จะแทนตัวอักษรตัวเดียว
  • [...] --- เราสามารถระบุเซตของตัวอักษรที่จะถูกแทนได้ เช่น [acd] จะแทนตัวอักษร a, c, หรือ d ก็ได้ โดยเราสามารถใช้เครื่องหมาย - ในการระบุได้ด้วย เช่น [a-z] จะแทนตัวอักษรภาษาอังกฤษพิมพ์เล็ก หรือ [a-z0-9] จะรวมตัวเลขเข้าไปด้วย นอกจากนี้ ถ้าเราขึ้นต้นรายการด้วย ^ หรือ ! เซตนี้จะแทนตัวอักษรทั้งหมดที่ไม่อยู่ในรายการ เช่น [^0-9] จะแทนตัวอักษรทั้งหมดที่ไม่ใช่ตัวเลข

ตัวอย่าง

เราสามารถใช้แพทเทิร์นเหล่านี้หลากหลาย เช่น

  • *.c --- แทนทุกแฟ้มข้อมูลที่มีนามสกุล c
  • */*.c --- แทนทุกแฟ้มข้อมูลที่มีนามสกุล c ในทุก ๆ ไดเร็กทอรีย่อย
  • */h*.cpp --- แทนทุกแฟ้มข้อมูลที่มีนามสกุล c ที่มีชื่อขึ้นต้นด้วย h ในทุก ๆ ไดเร็กทอรีย่อย
  • test?/h*.cpp --- แทนทุกแฟ้มข้อมูลที่มีนามสกุล c ที่มีชื่อขึ้นต้นด้วย h ในทุก ๆ ไดเร็กทอรีย่อยที่มีชื่อว่า test ตามด้วยตัวอักษรหนึ่งตัว
  • test[0-9]/out-[a-z] --- แทนแฟ้มขึ้นต้นด้วย out- ตามด้วยตัวอักษรภาษาอังกฤษตัวเล็ก ในไดเร็กทอรีย่อยที่มีชื่อว่า test ตามด้วยตัวเลขหนึ่งตัว