ฟังก์ชัน Zsh สำหรับแสดง file tree
เวลาทำงานกับ 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 ย่อยได้ง่าย
มันทำงานอย่างไร
มาแยกดูการทำงานของฟังก์ชันทีละขั้น:
- ls -R $1: คำสั่ง ls -R แสดงเนื้อหาของ Directory แบบ recursive (หรือ Directory ปัจจุบันถ้าไม่ระบุ argument)
- grep ":$": กรองผลลัพธ์ให้เหลือเฉพาะชื่อ Directory (บรรทัดที่ลงท้ายด้วย :)
- คำสั่ง 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 ได้ง่ายขึ้นมาก