Câu trả lời:
Có vẻ như bạn muốn tên cơ sở của dirname:
$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
dirname
lệnh sẽ giả sử nó trong thư mục hiện tại (còn gọi là ".").
parentname="$(basename "$(dirname "$pwd")")"
PWD
chữ hoa chữ thường và phải được viết hoa. Hãy thử parentname="$(basename "$(dirname "$PWD")")"
.
Bạn có thể sử dụng pwd để lấy thư mục làm việc hiện tại và sử dụng mở rộng tham số để tránh chuyển nó sang shell (phụ) khác.
echo ${PWD##*/}
Chỉnh sửa: nguồn đã được chứng minh
${path##*/}
Tôi nghĩ rằng đây là một giải pháp ít tài nguyên hơn:
$ filepath=/a/b/c/d/file
$ echo ${${filepath%/*}##*/}
d
chỉnh sửa: Xin lỗi, mở rộng lồng nhau không thể có trong bash, nhưng nó hoạt động trong zsh. Phiên bản Bash:
$ filepath=/a/b/c/d/file
$ path=${filepath%/*}
$ echo ${path##*/}
d
filepath=file
hoặc filepath = / file`.
foofile
gì? Nếu nó không phải là đường dẫn đầy đủ thì không thể biết (có thể nếu đó foofile
là một tệp hiện có không chỉ là "chuỗi").
Trong bash, trong một dòng:
$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'
Tôi thích câu trả lời của Julian67 ở trên nhất, nhưng đây là một phiên bản mở rộng:
file_path = "a/b/c/d/file.txt"
parent=$(echo $file_path | sed -e 's;\/[^/]*$;;') # cut away "/file.txt";'$' is end of string
parent=$(echo $parent | sed -e 's;.*\/;;') # cut away "/a/b/c/"
echo $parent # --> you get "d"