การเชี่ยวชาญในการจับคู่ไฟล์: การใช้คำสั่ง 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 ที่ตรงกันทั้งหมดภายในโครงสร้างไดเร็กทอรีที่กำหนด ทำให้กระบวนการจัดการไฟล์ของคุณเป็นไปอย่างราบรื่น

โดยการเชี่ยวชาญในคำสั่งเหล่านี้ คุณสามารถเพิ่มประสิทธิภาพในการนำทางและจัดการไฟล์ในสภาพแวดล้อมเชลล์ของคุณได้อย่างมีประสิทธิภาพ