Tôi đã từng tạo một tập lệnh hữu ích cho mục đích tương tự, với hàm fcd cho find-n-cd.
Bạn gõ fcd foo
và 3 điều có thể xảy ra:
- Không có thư mục foo nào được tìm thấy, sau đó nó trở lại với
"no such directory " $1
- Một tập tin được tìm thấy: Nó kiểm tra xem nó có phải là một thư mục (hoặc chỉ là một tập tin) hay không và nếu có thì nó sẽ ở đó.
- Nhiều tập tin được tìm thấy - sau đó một lựa chọn được trình bày, trong đó bạn chỉ cần nhập số lượng lựa chọn (hoặc một số đặc biệt để trả về).
Nó tương tự ở chỗ nó không cần bạn gõ toàn bộ đường dẫn, nhưng bạn đã gọi hàm một cách rõ ràng.
#!/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
}
Bạn phải sử source
dụng hàm ( source fcd.sh
| . fcd.sh
) và không thể gọi nó là tập lệnh, bởi vì cd
điều khác chỉ xảy ra trong ngữ cảnh của tập lệnh và sau khi hoàn thành, bạn sẽ quay lại thư mục bắt đầu ngay lập tức.
Vì nó hoạt động với locate
, nó khá nhanh trong việc tìm thư mục (nhưng không phải lúc nào cũng cập nhật).
Nó không xử lý khoảng trống trong tên thư mục một cách duyên dáng. Nếu bạn có một giải pháp tao nhã cho vấn đề tôi sẽ rất vui.
shopt -s autocd
vào dòng lệnh tại nó hoạt động. Bây giờ tôi chỉ có thể bắt đầu nhập tên thư mục và sử dụng tự động hoàn tất, sau đó nhấn return và shellcd
của thư mục. Thật tuyệt !