13 คะแนน โดย GN⁺ 2025-03-20 | 2 ความคิดเห็น | แชร์ทาง WhatsApp
  • fd เป็นโปรแกรมสำหรับค้นหารายการในระบบไฟล์ โดยเป็นทางเลือกแทนคำสั่ง find แบบดั้งเดิมที่เรียบง่ายกว่า เร็วกว่า และเป็นมิตรกับผู้ใช้มากกว่า
    • แม้จะไม่ได้รองรับความสามารถทั้งหมดของ find แต่ก็มีค่าเริ่มต้นที่เหมาะสมสำหรับการใช้งานทั่วไป
  • ใช้งานได้บน Windows, macOS, Linux
  • ไวยากรณ์เข้าใจง่าย: ใช้งานได้ง่ายในรูปแบบ fd PATTERN (สะดวกกว่า find -iname '*PATTERN*')
  • รองรับ regular expression และ glob pattern
  • ให้ประสิทธิภาพที่รวดเร็วด้วย การค้นหาไดเรกทอรีแบบขนาน
  • ไฮไลต์สีตามประเภทไฟล์ (คล้าย ls)
  • รองรับ การรันคำสั่งแบบขนาน
  • แยกแยะตัวพิมพ์เล็ก-ใหญ่แบบอัจฉริยะ: โดยปกติจะไม่สนใจตัวพิมพ์เล็ก-ใหญ่ แต่ถ้ามีตัวพิมพ์ใหญ่จะทำการแยกแยะ
  • ละเว้นไฟล์และไดเรกทอรีที่ซ่อนไว้โดยค่าเริ่มต้น
  • ละเว้นแพตเทิร์น .gitignore โดยค่าเริ่มต้น
  • ชื่อคำสั่งสั้นกว่า find 50%

วิธีใช้งาน

  • ค้นหารายการที่มีแพตเทิร์นอยู่ในไดเรกทอรีปัจจุบัน fd netfl
  • ค้นหาด้วย regular expression fd '^x.*rc$'
  • ค้นหาในไดเรกทอรีที่กำหนด fd passwd /etc
  • แสดงรายการไฟล์ทั้งหมดใต้ไดเรกทอรีปัจจุบันแบบ recursive fd
  • ค้นหาไฟล์ตามนามสกุลที่กำหนด (ใช้ตัวเลือก -e) fd -e md
  • ค้นหาชื่อไฟล์แบบตรงตัว (ใช้ตัวเลือก -g) fd -g libc.so /usr
  • ค้นหารวมไฟล์ที่ซ่อนและไฟล์ที่ถูกละเว้น (ใช้ตัวเลือก -H, -I) fd -H pre-commit fd -I num_cpu
  • ค้นหาจากพาธทั้งหมดแทนชื่อไฟล์ (ใช้ตัวเลือก -p) fd -p '.*/lesson-\d+/[a-z]+.(jpg|png)'
  • รันคำสั่งกับผลลัพธ์แต่ละรายการที่ค้นเจอ (-x) fd -e zip -x unzip
  • ส่งผลการค้นหาทั้งหมดให้คำสั่งเดียว (-X) fd -g 'test_*.py' -X vim
  • ไวยากรณ์ placeholder
    • {}: พาธเต็มของผลการค้นหา
    • {.}: พาธที่ตัดนามสกุลไฟล์ออก
    • {/}: ชื่อไฟล์
    • {//}: ไดเรกทอรีแม่
    • {/.}: ชื่อไฟล์ที่ตัดนามสกุลออก
  • สามารถยกเว้นไดเรกทอรีหรือไฟล์ที่กำหนดได้ (ใช้ตัวเลือก -E) fd -H -E .git
  • สามารถสร้างไฟล์ .fdignore เพื่อกำหนดแพตเทิร์นที่ยกเว้นแบบ global ได้
  • ลบไฟล์ที่ค้นพบได้ (-X rm) fd -H '^\.DS_Store$' -tf -X rm

ตัวเลือกคำสั่งหลัก

  • -H: ค้นหารวมไฟล์และไดเรกทอรีที่ซ่อนอยู่
  • -I: ไม่สนใจ .gitignore และ .fdignore
  • -p: ค้นหาจากพาธทั้งหมด
  • -e: ค้นหาตามนามสกุลที่กำหนด
  • -x: รันคำสั่งกับผลการค้นหา
  • -X: ส่งผลการค้นหาทั้งหมดให้คำสั่งเดียว
  • -E: ยกเว้นไฟล์หรือไดเรกทอรีที่กำหนด

การเปรียบเทียบประสิทธิภาพ (Benchmark)

  • ผลการทดสอบค้นหาใน 750,000 ไดเรกทอรี และ 4 ล้านไฟล์
    • ประสิทธิภาพของ find: ประมาณ 19.9 วินาที
    • ประสิทธิภาพของ fd: ประมาณ 854.8ms
  • เร็วกว่า find 23 เท่า

การผสานการทำงานกับโปรแกรมอื่น

  • แสดงผลการค้นหาจาก fd ใน fzf ได้ export FZF_DEFAULT_COMMAND='fd --type file'
  • แสดงผลลัพธ์ของ fd เป็นเมนูใน rofi fd --type f -e pdf . $HOME | rofi -dmenu
  • แสดงผลลัพธ์ในโครงสร้างแบบ tree fd | tree --fromfile
  • ใช้ผลการค้นหาใน xargs ได้ fd -0 -e rs | xargs -0 wc -l

2 ความคิดเห็น

 
dbs0829 2025-03-20

มีปลั๊กอิน neovim ตัวหนึ่งที่ใช้ fd ก็เลยติดตั้งไว้ แล้วก็ใช้มาจนถึงตอนนี้เลยครับ 555

 
GN⁺ 2025-03-20
ความคิดเห็นใน Hacker News
  • เปิดตัว Alfred workflow แล้ว ใช้ fd บ่อยมากในการค้นหาไดเรกทอรีที่กำหนดเอง ใช้ทุกวันและยอดเยี่ยมมาก
    • Hyperfine ก็เป็นเครื่องมือที่ยอดเยี่ยมและถูกมองข้าม
  • เป็นแฟนของ sharkdp ขอบคุณที่สร้างซอฟต์แวร์เจ๋ง ๆ ที่ใช้ทุกวัน
    • ใช้ bat, fd, hexyl, hyperfine
    • ถ้าวิศวกรที่ได้รับค่าตอบแทนดีบริจาคเดือนละ $10 อินเทอร์เน็ตก็น่าจะดีขึ้น
    • มีเครื่องมือดี ๆ มากมาย และเราควรสร้างระบบนิเวศที่ช่วยสนับสนุนสิ่งเหล่านี้
  • สามารถติดตั้ง fd, bat, numbat, hexyl, hyperfine ได้อย่างรวดเร็ว และดูสกรีนช็อตได้ที่ Terminal Trove
    • มีลิงก์สำหรับ fd, bat, numbat, hyperfine, hexyl
    • ติดตั้งและดูสกรีนช็อตได้
  • อยากให้แฟล็กของ fd และ rg สอดคล้องกัน เช่น fd และ rg ต่างก็มีแฟล็ก --type แต่ความหมายต่างกัน
    • fd หมายถึงไฟล์/ไดเรกทอรี/ซิมลิงก์ ฯลฯ ส่วน rg หมายถึง MIME type ของไฟล์
    • fd มีแฟล็ก --extension แต่ rg ไม่มี
    • เนื่องจากการใช้งานสองเครื่องมือนี้มีความสัมพันธ์กันสูง การมีแฟล็กชื่อคล้ายกันจึงน่าจะเป็นประโยชน์
  • เหตุผลที่ไม่ใช้เครื่องมือ Rust ตัวใหม่ ๆ คือจำออปชันของเครื่องมือดั้งเดิมได้ยากอยู่แล้ว
    • ใช้ ripgrep ใน VS Code แต่บน command line ใช้ grep
    • ขอแค่เครื่องมือทำงานได้ จะเขียนด้วยภาษาอะไรก็ไม่สำคัญ
    • GNU Stow เขียนด้วย Perl แต่ก็เป็นหนึ่งในเครื่องมือ Unix ที่ชอบที่สุด
    • ต่อให้เครื่องมือ Rust เป็นตัวแทนแบบ drop-in ก็อาจไม่ติดตั้งเองด้วยมือ
    • ในฐานะผู้ใช้ การปรับปรุงความเร็วและ memory safety ไม่ใช่เรื่องสำคัญ
    • ภาษาอื่นอย่าง Go ก็รับประกัน memory safety ได้ และการมีส่วนร่วมของชุมชนก็สูง
    • ยังไม่เชื่อเต็มที่กับเรื่องเล่าว่า Rust คือผู้กอบกู้
    • ถ้า macOS หรือ Ubuntu เปลี่ยนมาใช้ตัวแทนที่เขียนด้วย Rust แล้วไม่กระทบ workflow ก็ไม่บ่น
  • ควรเข้าไปดู Terminal Trove เป็นครั้งคราว
    • อาจเจอทางเลือกที่ใช้ง่ายของเครื่องมือที่ใช้บ่อย
    • find แทนได้ด้วย fd, time แทนได้ด้วย hyperfine, grep แทนได้ด้วย ripgrep
    • ยังมี t-rec ที่แปลง asciinema เป็น .gif, koji ที่สร้าง commit แบบ manual เป็นต้น
  • กำลังจะลองใช้ fd เพราะจำวิธีใช้อาร์กิวเมนต์ของ find ได้ยาก เลยส่วนใหญ่ใช้ find . | grep what_i_am_looking_for
    • ชอบการทำงานที่ผสานกับ xargs
    • ยังหาไม่เจอว่า fd จัดการกับการไล่สำรวจไดเรกทอรี symlink อย่างไร
  • ใช้ fd หนักมากทุกวัน และติดตั้งไว้เป็นค่าเริ่มต้นบนเครื่องใหม่
    • ใช้ find มานาน แต่ไม่ได้ใช้งานสะดวก
    • เห็นด้วย 100% กับเทรนด์ยูทิลิตีทางเลือกช่วงหลัง
    • อาจไม่ได้คงความยืดหยุ่นทั้งหมดของของเดิมไว้ แต่สำหรับกรณีทั่วไปใช้ง่ายกว่ามาก
  • การที่มันละเว้นหลายโฟลเดอร์โดยค่าเริ่มต้นทำให้ไม่สะดวก
    • ใช้ find เมื่อต้องการรู้ว่ามันอยู่ตรงไหนในระบบ
    • fd มีออปชันให้ไม่ละเว้น แต่จำไม่ได้ เลยกลับไปใช้ find
  • ชอบเครื่องมือ Rust CLI ใหม่ ๆ แต่ fd ก็เหมือน tar กับ ln ตรงที่จำวิธีใช้ได้ยาก
    • ไม่ใช่ความผิดของใคร
    • ต้องกลับไปอ่านคู่มือใหม่อยู่เสมอ
    • แม้ GNU find จะมีจุดแปลก ๆ แต่กลับจำได้ดีกว่า