ฉันเคยทำสคริปต์ที่มีประโยชน์สำหรับวัตถุประสงค์ที่คล้ายกันด้วยฟังก์ชั่นfcdสำหรับ find-n-cd
คุณพิมพ์fcd foo
และ 3 สิ่งที่อาจเกิดขึ้น:
- ไม่พบไดเรกทอรีฟูดังกล่าวจากนั้นจะส่งคืนพร้อม
"no such directory " $1
- พบหนึ่งไฟล์: มันทดสอบว่าเป็นไดเรกทอรี (หรือเพียงแค่ไฟล์) และถ้าเป็นเช่นนั้นมันจะอยู่ที่นั่น
- พบไฟล์หลายไฟล์ - จากนั้นจะมีการเลือกซึ่งคุณเพียงพิมพ์หมายเลขของสิ่งที่เลือก (หรือหมายเลขพิเศษเพื่อส่งคืน)
มันคล้ายกับที่ไม่ต้องการให้คุณพิมพ์เส้นทางทั้งหมด แต่คุณได้เรียกใช้ฟังก์ชันอย่างชัดเจน
#!/bin/bash
#
# find cd. For input foo, find all directories .../.../foo
# GPLv3 Stefan Wagner (2010, 2012)
#
# doesn't handle blanks in directory names gracefully.
#
fcd ()
{
list=$(locate $1 | egrep "/$1$")
count=$(echo $list | wc -w )
case $count in
0)
echo "unknown directory: "$1 && return
# could search for partial matches Doc => Documentation
;;
1)
if [[ -d "$list" ]]; then
echo "$list";
cd "$list";
else
echo "not a directory: $1"
fi
;;
*)
select directory in $list "/exit/"
do
if [[ "$directory" = "/exit/" ]]; then break; fi
if [[ -d "$directory" ]]; then
echo "$directory";
cd "$directory";
break
else
echo "not a directory: "$1
fi
done
;;
esac
}
คุณต้องsource
ใช้ฟังก์ชัน ( source fcd.sh
| . fcd.sh
) และไม่สามารถเรียกมันว่าเป็นสคริปต์เพราะcd
จะเกิดขึ้นเฉพาะในบริบทของสคริปต์เท่านั้นและหลังจากเสร็จสิ้นคุณจะกลับมาเริ่มต้น dir ทันที
เนื่องจากใช้งานlocate
ได้มันค่อนข้างเร็วในการค้นหาไดเรกทอรี (แต่ไม่เสมอไป)
ไม่จัดการช่องว่างในชื่อไดเรกทอรีอย่างสง่างาม หากคุณมีทางออกที่สง่างามสำหรับปัญหาฉันจะมีความสุข
shopt -s autocd
ที่บรรทัดคำสั่งที่ใช้งานได้ ตอนนี้ฉันสามารถเริ่มพิมพ์ชื่อไดเรกทอรีและใช้การเติมข้อความอัตโนมัติจากนั้นกด return และเชลล์cd
ลงในไดเรกทอรี เจ๋ง !