Một phiên bản thậm chí còn chung hơn cho phép sử dụng find
các tùy chọn:
#!/bin/bash
set -e
path="$1"
shift 1
while [[ $path != / ]];
do
find "$path" -maxdepth 1 -mindepth 1 "$@"
# Note: if you want to ignore symlinks, use "$(realpath -s "$path"/..)"
path="$(readlink -f "$path"/..)"
done
Ví dụ: (giả sử tập lệnh được lưu dưới dạng find_up.sh
)
find_up.sh some_dir -iname "foo*bar" -execdir pwd \;
... sẽ in tên của tất cả các some_dir
tổ tiên (bao gồm cả chính nó) cho đến khi /
tìm thấy một tệp có mẫu.
Khi sử dụng readlink -f
đoạn script trên sẽ theo các liên kết tượng trưng trên đường lên, như đã lưu ý trong các bình luận. realpath -s
Thay vào đó, bạn có thể sử dụng , nếu bạn muốn theo dõi các đường dẫn theo tên ("/ foo / bar" sẽ chuyển lên "foo" ngay cả khi "thanh" là một liên kết tượng trưng) - tuy nhiên yêu cầu cài đặt realpath
không được cài đặt theo mặc định trên hầu hết các nền tảng.