Lấy thư mục cha cho một tập tin


24

Tôi muốn chỉ lấy tên của thư mục mẹ cho một tập tin.

Ví dụ: Khi tôi có path=/a/b/c/d/file, tôi chỉ muốn dvà không /a/b/c/d(mà tôi nhận được dirname $path) làm đầu ra.

Có cách nào tinh vi để làm điều này?

Câu trả lời:


26

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

tại sao tôi nhận được thay vì thư mục cha trên debian?
Amir

@Amir: Bạn đang bắt đầu với một đường dẫn đầy đủ, hay chỉ là một tên tệp? Nếu nó chỉ là một tên tệp, dirnamelệnh sẽ giả sử nó trong thư mục hiện tại (còn gọi là ".").
Gordon Davisson

tốt, tôi đang sử dụng cái này:parentname="$(basename "$(dirname "$pwd")")"
Amir

1
@Amir: Biến Shell có phân biệt PWDchữ hoa chữ thường và phải được viết hoa. Hãy thử parentname="$(basename "$(dirname "$PWD")")".
Gordon Davisson


2

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

Có một số trường hợp cạnh này không xử lý tốt, chủ yếu là khi không có đường dẫn đa cấp đầy đủ. Ví dụ: thử với filepath=filehoặc filepath = / file`.
Gordon Davisson

Thật. Nhưng thư mục cha mẹ là 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").
uzsolt

1

Trong bash, trong một dòng:

$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'

2
bạn có thể vui lòng xây dựng các thủ tục liên quan? nó có thể giúp ích cho độc giả tương lai. Ngoài ra, hãy cố gắng không viết 1/2 câu trả lời.
Lorenzo Von Matterhorn

0

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"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.