OOZOU
ติดต่อเรา
กลับไปหน้า TIL
shell

ฟังก์ชัน Zsh สำหรับแสดง file tree

13 ตุลาคม 2563

เวลาไล่ดูไดเรกทอรีบน command line การได้เห็นโครงสร้างของไดเรกทอรีและไดเรกทอรีย่อยในรูปแบบ "tree" มักช่วยได้มาก แม้จะมีเครื่องมือให้เลือกมากมาย เช่น tree แต่บางครั้งคุณอาจอยากได้โซลูชันแบบกำหนดเองง่าย ๆ ที่ผนวกเข้ากับ shell ของคุณโดยตรง ในโพสต์นี้เราจะพาไปสร้างฟังก์ชัน Zsh ง่าย ๆ สำหรับแสดงโครงสร้างของไดเรกทอรีในรูปแบบ tree

สร้างฟังก์ชัน Zsh สำหรับแสดง file tree

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

ขั้นตอนที่ 1: เพิ่มฟังก์ชัน lst() ลงใน .zshrc

ขั้นแรกคือกำหนดฟังก์ชัน lst() ไว้ในไฟล์ .zshrc ของคุณ ฟังก์ชันนี้รับ argument เสริมหนึ่งตัว ซึ่งเป็น path ของไดเรกทอรีใดก็ได้ แล้วแสดง tree ของไดเรกทอรีโดยเริ่มจากจุดนั้น ถ้าไม่ระบุไดเรกทอรี ค่าเริ่มต้นคือไดเรกทอรีปัจจุบัน

เปิดไฟล์ .zshrc ด้วย text editor ที่คุณถนัด แล้วเพิ่มฟังก์ชันต่อไปนี้:

lst() {
    if [ "$1" != "" ] # or better, if [ -n "$1" ]
    then
        ls -R $1 | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'
    else
        ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'
    fi
}

ขั้นตอนที่ 2: โหลดการตั้งค่า Zsh ใหม่

หลังจากเพิ่มฟังก์ชันแล้ว คุณต้องโหลดไฟล์ .zshrc ใหม่เพื่อให้การเปลี่ยนแปลงมีผล โดยรันคำสั่งต่อไปนี้ใน terminal:

sh
source ~/.zshrc

ขั้นตอนที่ 3: การใช้ฟังก์ชัน lst()

เมื่อเพิ่มฟังก์ชันลงใน .zshrc แล้ว คุณก็เริ่มใช้งานได้ทันที ฟังก์ชัน lst() ให้คุณแสดงไดเรกทอรีย่อยทั้งหมดในไดเรกทอรีที่ระบุในรูปแบบ tree วิธีใช้เป็นแบบนี้:

หากต้องการแสดงไดเรกทอรีย่อยของโฟลเดอร์หนึ่ง (เช่น spec) ให้รัน:

sh
lst spec

คำสั่งนี้จะสร้างโครงสร้างคล้าย tree ที่แสดงไดเรกทอรีย่อยทั้งหมดในโฟลเดอร์ spec

ถ้าอยากดูโครงสร้าง tree ของไดเรกทอรีปัจจุบัน ก็แค่รัน:

sh
lst

ฟังก์ชัน lst() จะแสดงโครงสร้างของโฟลเดอร์ออกมา ทำให้เข้าใจลำดับชั้นของไดเรกทอรีได้ง่ายขึ้น

ตัวอย่างผลลัพธ์

สมมติว่าคุณมีโครงสร้างไดเรกทอรีแบบนี้:

bash
spec/
├── controllers/
│   └── users/
├── models/
└── views/

การรันคำสั่ง lst spec จะให้ผลลัพธ์ประมาณนี้:

css
   spec
   |--controllers
   |   |--users
   |--models
   |--views

โครงสร้าง tree ง่าย ๆ แบบนี้ช่วยให้เห็นภาพความสัมพันธ์ระหว่างไดเรกทอรีกับไดเรกทอรีย่อยได้ง่าย

มันทำงานอย่างไร

มาแยกดูการทำงานของฟังก์ชันทีละขั้น:

  1. ls -R $1: คำสั่ง ls -R แสดงเนื้อหาของไดเรกทอรีแบบ recursive (หรือไดเรกทอรีปัจจุบันถ้าไม่ระบุ argument)
  2. grep ":$": กรองผลลัพธ์ให้เหลือเฉพาะชื่อไดเรกทอรี (บรรทัดที่ลงท้ายด้วย :)
  3. คำสั่ง sed:
    • 's/:$//': ลบเครื่องหมาย colon ท้ายชื่อไดเรกทอรีแต่ละบรรทัด
    • 's/[^-][^/]*//--/g': แทนที่ forward slash (/) ด้วย dash (--) เพื่อแปลงโครงสร้างให้อยู่ในรูปแบบคล้าย tree
    • 's/^/ /': เพิ่มการเยื้องให้กับ tree ของไดเรกทอรี
    • 's/-/|/': แทนที่ dash ด้วยเครื่องหมาย pipe แนวตั้ง (|) เพื่อให้รูปแบบ tree ชัดขึ้นอีก

ขั้นตอนที่ 4: ปรับแต่งฟังก์ชัน lst()

คุณสามารถปรับแต่งฟังก์ชัน lst() ให้เหมาะกับความต้องการได้ง่าย ๆ ตัวอย่างเช่น เปลี่ยนการจัดรูปแบบของโครงสร้าง tree หรือเพิ่มตัวเลือกอื่นสำหรับแสดงไฟล์ ถ้าคุณต้องแสดงทั้งไฟล์และไดเรกทอรีอยู่บ่อย ๆ ก็ปรับฟังก์ชันให้รวมไฟล์ด้วยได้ โดยเอาตัวกรอง grep ที่แสดงเฉพาะไดเรกทอรีออก

ทางเลือก: ใช้คำสั่ง tree

ถ้าคุณชอบแบบสำเร็จรูป ก็ใช้คำสั่ง tree ซึ่งออกแบบมาเพื่อแสดงโครงสร้างไดเรกทอรีโดยเฉพาะได้ tree เป็น utility ที่หาได้ทั่วไปและติดตั้งได้บนระบบตระกูล Unix ส่วนใหญ่ วิธีติดตั้ง tree ให้ใช้คำสั่งใดคำสั่งหนึ่งต่อไปนี้ตามระบบของคุณ:

บนระบบ Ubuntu หรือตระกูล Debian:

sh
sudo apt-get install tree

บน macOS:

sh
brew install tree

เมื่อติดตั้งแล้ว คุณสามารถใช้คำสั่ง tree เพื่อสร้างผลลัพธ์ในลักษณะเดียวกัน:

sh
tree spec

คำสั่ง tree มีฟีเจอร์ในตัวมากกว่า เช่น ความสามารถในการแสดงขนาดไฟล์ permission และอื่น ๆ อย่างไรก็ตาม ถ้าคุณอยากให้ทุกอย่างเรียบง่าย หรือไม่มี tree ให้ใช้ ฟังก์ชัน lst() ก็เป็นทางเลือกเบา ๆ ที่ยอดเยี่ยม

สรุป

ฟังก์ชัน Zsh ที่เราสร้างขึ้นเป็นวิธีง่ายและมีประสิทธิภาพในการแสดงโครงสร้างไดเรกทอรีในรูปแบบ tree การเพิ่มฟังก์ชัน lst() ลงในไฟล์ .zshrc ช่วยให้คุณเห็นภาพไดเรกทอรีย่อยของโฟลเดอร์ใดก็ได้ในระบบอย่างรวดเร็ว ซึ่งมีประโยชน์มากสำหรับการไล่ดูโครงสร้างไดเรกทอรีที่ซับซ้อน และการทำความเข้าใจลำดับชั้นของไฟล์และโฟลเดอร์ในโปรเจกต์ของคุณ

ถ้าคุณต้องการความสามารถที่มากกว่านี้ ลองพิจารณาใช้คำสั่ง tree เพื่อฟีเจอร์ขั้นสูงเพิ่มเติม แต่สำหรับโซลูชันแบบกำหนดเองที่เบาและผนวกเข้ากับ Zsh shell ของคุณโดยตรง ฟังก์ชัน lst() คือตัวเลือกที่ลงตัว


คำถามที่พบบ่อย

1. ฟังก์ชัน lst() ใช้ทำอะไร?

ฟังก์ชัน lst() คือฟังก์ชัน Zsh ที่เขียนขึ้นเองเพื่อแสดงโครงสร้างไดเรกทอรีในรูปแบบ tree มันใช้ ls และ sed จัดรูปแบบผลลัพธ์ ทำให้เห็นภาพลำดับชั้นของโฟลเดอร์ได้โดยตรงใน terminal

2. จะเพิ่มฟังก์ชัน lst() ลงในการตั้งค่า Zsh ได้อย่างไร?

คุณเพิ่มฟังก์ชัน lst() ได้โดยแก้ไขไฟล์ .zshrc แล้ววางนิยามของฟังก์ชันลงไปในไฟล์ จากนั้นรัน source ~/.zshrc เพื่อโหลดการตั้งค่าใหม่และทำให้ฟังก์ชันพร้อมใช้งาน

3. ปรับแต่งผลลัพธ์ของฟังก์ชัน lst() ได้ไหม?

ได้ คุณปรับแต่งฟังก์ชันได้โดยแก้คำสั่ง sed ที่ใช้จัดรูปแบบผลลัพธ์ จะเปลี่ยนโครงสร้าง tree เพิ่มรายละเอียด หรือรวมไฟล์ในการแสดงผลด้วยก็ได้

4. มีทางเลือกอื่นแทนการใช้ฟังก์ชัน lst() ไหม?

คำสั่ง tree เป็น utility ที่หาได้ทั่วไปซึ่งแสดงโครงสร้างไดเรกทอรีในรูปแบบ tree มันมีฟีเจอร์มากกว่าฟังก์ชัน lst() และติดตั้งได้บนระบบตระกูล Unix ส่วนใหญ่

5. ใช้ฟังก์ชัน lst() บนระบบอื่นที่ไม่ใช่ Zsh ได้ไหม?

ฟังก์ชัน lst() เขียนมาสำหรับ Zsh แต่ปรับใช้กับ shell อื่นอย่าง Bash ได้ง่าย โดยเพิ่มลงในไฟล์ตั้งค่าที่เหมาะสม (.bashrc สำหรับ Bash)

การผนวกฟังก์ชัน lst() เข้ากับ workflow ของ Zsh จะช่วยยกระดับประสบการณ์ command line ของคุณ และทำให้การไล่ดูไดเรกทอรีง่ายขึ้นมาก

เพิ่มเติมเกี่ยวกับ shell

shell8 ธันวาคม 2563

รันคำสั่งแบบ incognito/ส่วนตัวสำหรับ Bash และ Zsh

แค่ใส่ space ไว้หน้าคำสั่ง คำสั่งนั้นก็จะไม่ถูกบันทึกลง ~/.bash\_history เช่น qrencode -o out.png "Some secret text"

shell22 ตุลาคม 2563

อัปเกรดฐานข้อมูล postgres ด้วย homebrew

การอัปเกรด postgres ทำได้โดยรัน

shell13 ตุลาคม 2563

คัดลอกไฟล์ด้วย Amazon AWS S3 CLI พร้อมกำหนดสิทธิ์

เปิด term (หรือโปรแกรมที่คล้ายกัน) แล้ววางคำสั่งต่อไปนี้:

มีโปรเจกต์ในใจ?

เรายินดีรับฟังสิ่งที่คุณกำลังสร้าง

เริ่มต้นสนทนาhello@oozou.com
OOZOU Logo

กรุงเทพฯ · สิงคโปร์ · ฮ่องกง

X
Facebook
Instagram
LinkedIn

บริการ

  • พัฒนาเว็บ
  • เอเจนต์ AI และ Generative AI
  • พัฒนาแอปมือถือ
  • วิศวกรรมและวิเคราะห์ข้อมูล
  • UI/UX และการออกแบบผลิตภัณฑ์
  • การเปลี่ยนผ่านสู่ดิจิทัล

บริษัท

  • เกี่ยวกับเรา
  • ร่วมงานกับเรา
  • บล็อก
  • กรณีศึกษา
  • Today I Learned
  • ติดต่อเรา

เพิ่มเติม

  • อุตสาหกรรม
  • เครือข่ายพันธมิตร
© 2026 OOZOU สงวนลิขสิทธิ์
นโยบายความเป็นส่วนตัวจรรยาบรรณนโยบาย ABAC