การเชี่ยวชาญในการจับคู่ไฟล์: การใช้คำสั่ง Glob
และ Find
ในการเขียนสคริปต์เชลล์
เมื่อเข้าสู่การเขียนสคริปต์เชลล์และการจัดการไฟล์ คำถามหนึ่งที่มักเกิดขึ้นคือ: สามารถสร้าง glob ที่ตรงกับไฟล์ในไดเร็กทอรีปัจจุบันและไดเร็กทอรีย่อยทั้งหมดได้หรือไม่? การจัดการเส้นทางไฟล์อย่างมีประสิทธิภาพอาจมีความซับซ้อนเล็กน้อย โดยเฉพาะเมื่อคุณต้องการให้แน่ใจว่าคุณไม่เพียงแต่จับคู่ไฟล์ในไดเร็กทอรีการทำงานปัจจุบันของคุณ แต่ยังต้องรวมไฟล์ที่อยู่ลึกลงไปในลำดับชั้นของโฟลเดอร์ด้วย
ในบล็อกโพสต์นี้ เราจะสำรวจโครงสร้างของไดเร็กทอรีสมมุติและแสดงวิธีการจับคู่ไฟล์โดยใช้รูปแบบ glob
และคำสั่ง find
ที่หลากหลาย โดยเมื่อเสร็จสิ้น คุณจะรู้สึกมั่นใจมากขึ้นในการจัดการการค้นหาไฟล์ด้วยเครื่องมือเหล่านี้
ทำความเข้าใจกับโครงสร้างไดเร็กทอรี
มาดูโครงสร้างไดเร็กทอรีที่เรากำลังทำงานด้วยกัน:
.
|-- README.txt
|-- firstlevel.rb
`-- lib
|-- models
| |-- foo
| | `-- fourthlevel.rb
| `-- thirdlevel.rb
`-- secondlevel.rb
ในโครงสร้างนี้ เรามีไฟล์และโฟลเดอร์ที่ผสมกัน:
- ไฟล์:
README.txt
firstlevel.rb
secondlevel.rb
thirdlevel.rb
(ภายใต้lib/models
)fourthlevel.rb
(ภายใต้lib/models/foo
)
เป้าหมาย: จับคู่ไฟล์ทั้งหมดที่มีนามสกุล .rb
ในไดเร็กทอรีปัจจุบันและไดเร็กทอรีย่อยทั้งหมด
วิธีการ: การใช้คำสั่ง find
แม้ว่าคุณอาจพิจารณาใช้ glob
เพื่อตรวจสอบไฟล์ของคุณ แต่การใช้คำสั่ง find
ถือเป็นวิธีที่ได้รับการแนะนำเนื่องจากความยืดหยุ่นและพลังของมัน นี่คือวิธีที่คุณสามารถกำหนดโครงสร้างคำสั่งของคุณ:
find . -name '*.rb' -type f
วิเคราะห์คำสั่ง
find
: คำสั่งนี้เริ่มการค้นหาผ่านเส้นทาง.
: กำหนดไดเร็กทอรีปัจจุบันเป็นจุดเริ่มต้นของการค้นหา-name '*.rb'
: ตัวเลือกนี้บอกให้find
ค้นหาไฟล์ที่ตรงกับรูปแบบ*.rb
- หมายความว่าทุกไฟล์ที่มีนามสกุล.rb
-type f
: การกำหนดนี้ทำให้แน่ใจว่าจับคู่เฉพาะไฟล์เท่านั้น ไม่รวมโฟลเดอร์ในผลลัพธ์
ข้อดีของการใช้ find
- ความยืดหยุ่น: แตกต่างจาก
glob
ที่อาจมีปัญหากับโครงสร้างไดเร็กทรีที่ซับซ้อนfind
สามารถเลื่อนผ่านทุกระดับของไดเร็กทอรีย่อยได้อย่างราบรื่น - ตัวเลือกเพิ่มเติม: คุณสามารถเพิ่มความสามารถในการค้นหาของคุณด้วยพารามิเตอร์อื่นๆ เช่น การกรองตามเวลาที่แก้ไข ขนาด และอื่นๆ
- ประสิทธิภาพ: การใช้
find
มักมีประสิทธิภาพมากกว่า โดยเฉพาะในต้นไม้ไดเร็กทรีขนาดใหญ่ ทำให้ค้นหาไฟล์ได้เร็วขึ้น
วิธีการอื่น: การใช้รูปแบบ Glob
แม้ว่าการใช้ find
จะได้รับการแนะนำ แต่คุณก็สามารถใช้วิธีการแบบ glob โดยตรงได้เช่นกัน อย่างไรก็ตาม สิ่งสำคัญที่ต้องทราบคือการจัดการกับโครงสร้างที่ซับซ้อนด้วย globs อาจทำให้ยุ่งยากและอ่านไม่ง่าย นี่คือตัวอย่างพื้นฐานของวิธีที่รูปแบบ glob ง่ายๆ สามารถใช้ได้:
echo **/*.rb
คำสั่งนี้ใช้รูปแบบ **
ซึ่งอนุญาตให้ globbing ผ่านทุกโฟลเดอร์แบบทับซ้อนในเชลล์ที่รองรับการ globbing ขยาย (เช่น bash
กับ shopt -s globstar
)
ข้อจำกัดของรูปแบบ Glob
- ความซับซ้อน: เมื่อโครงสร้างมีความซับซ้อน รูปแบบ glob อาจอ่านและบำรุงรักษาได้ยาก
- ความเข้ากันได้: เชลล์ไม่ทุกรุ่นรองรับการ globbing ขยาย ซึ่งอาจนำไปสู่พฤติกรรมที่ไม่สอดคล้องกันในสภาพแวดล้อมต่างๆ
สรุป
โดยสรุป แม้จะเป็นไปได้ที่จะใช้รูปแบบ glob
เพื่อตรงกับไฟล์ในไดเร็กทอรีปัจจุบันและไดเร็กทอรีย่อย แต่คำสั่ง find
เป็นเครื่องมือที่มีความแข็งแกร่งและยืดหยุ่นซึ่งให้โซลูชันที่มีพลังมากขึ้นสำหรับความต้องการการค้นหาไฟล์ในสคริปต์เชลล์
การใช้คำสั่ง:
find . -name '*.rb' -type f
จะช่วยให้คุณสามารถแสดงผลไฟล์ .rb
ที่ตรงกันทั้งหมดภายในโครงสร้างไดเร็กทอรีที่กำหนด ทำให้กระบวนการจัดการไฟล์ของคุณเป็นไปอย่างราบรื่น
โดยการเชี่ยวชาญในคำสั่งเหล่านี้ คุณสามารถเพิ่มประสิทธิภาพในการนำทางและจัดการไฟล์ในสภาพแวดล้อมเชลล์ของคุณได้อย่างมีประสิทธิภาพ