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

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

13 ตุลาคม 2563

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

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

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

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

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

เปิดไฟล์ .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() ให้คุณแสดง Directory ย่อยทั้งหมดใน Directory ที่ระบุในรูปแบบ tree วิธีใช้เป็นแบบนี้:

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

sh
lst spec

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

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

sh
lst

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

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

ตัวอย่างเช่น ถ้าคุณมีโครงสร้าง Directory แบบนี้:

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

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

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

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

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

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

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

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

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

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

ถ้าคุณชอบแบบสำเร็จรูป ก็ใช้คำสั่ง tree ซึ่งออกแบบมาเพื่อแสดงโครงสร้าง Directory โดยเฉพาะได้ 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 ที่เราสร้างขึ้นเป็นวิธีง่ายและมีประสิทธิภาพในการแสดงโครงสร้าง Directory ในรูปแบบ tree เพิ่มฟังก์ชัน lst() ลงในไฟล์ .zshrc แล้ว คุณจะเห็น Directory ย่อยของโฟลเดอร์ไหนก็ได้ในระบบทันที ช่วยได้มากเวลาต้องดูโครงสร้าง Directory ที่ซับซ้อน หรืออยากเข้าใจว่าไฟล์และโฟลเดอร์ในโปรเจกต์ซ้อนกันเป็นลำดับชั้นอย่างไร

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


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

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

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

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

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

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

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

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

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

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

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

เพิ่มฟังก์ชัน lst() เข้าไปใน workflow ของ Zsh แล้วการใช้ command line จะสะดวกขึ้น และดูโครงสร้าง Directory ได้ง่ายขึ้นมาก

อ่านบทความเกี่ยวกับ 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
OOZOU Co., Ltd.
548 อาคารวันซิตี้เซ็นเตอร์
ถนนเพลินจิต
กรุงเทพฯ 10330
ประเทศไทย
+66 2544 0000
hello@oozou.com

บริการ

  • Web Development
  • AI Agents & Generative AI
  • Mobile App Development
  • Data Analytics & Engineering
  • UI/UX & Product Design
  • Digital Transformation

บริษัท

  • เกี่ยวกับเรา
  • ร่วมงานกับเรา
  • บทความ
  • Case Studies
  • Live Demos
  • Today I Learned
  • ติดต่อเรา

เพิ่มเติม

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