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
              dirnamelệnh sẽ giả sử nó trong thư mục hiện tại (còn gọi là ".").
                    parentname="$(basename "$(dirname "$pwd")")"
                    PWDchữ 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=filehoặc filepath = / file`.
                    foofilegì? Nếu nó không phải là đường dẫn đầy đủ thì không thể biết (có thể nếu đó foofilelà 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"