Trích xuất thư mục từ đường dẫn


123

Trong tập lệnh của tôi, tôi cần thư mục của tệp mà tôi đang làm việc. Ví dụ: tệp = "thứ / backup / file.zip" . Tôi cần một cách để lấy chuỗi " thứ / sao lưu / " từ biến $file.

Câu trả lời:


203
dirname $file

là những gì bạn đang tìm kiếm


+1, đánh bại tôi với nó. có thể đã được nhanh hơn nhưng đã prompoted để nhập nhiều hơndirname $file
matchew

1
dirname "$file", hơn. Nếu không có dấu ngoặc kép, điều này sẽ hoạt động sai nếu tên tệp hoặc thư mục có khoảng trắng.
Charles Duffy

fml, câu hỏi nên được giải nén dir tuyệt đối từ tệp, làm cách nào để làm điều đó? dirname mang lại đường dẫn tương đối Tôi đoán
Alexander Mills

Thật nổi bật là điều này khó thực hiện như thế nào trong tập lệnh Batch win - tôi cho là một lý do khác để không sử dụng chúng!
bunkerdive

47
dirname $file

sẽ xuất ra

stuff/backup

ngược lại với basename:

basename $file

sẽ xuất ra

file.zip

I figured Matt sẽ có thể hình dung nó từ đó (người đàn ông dirname) :)
Matthieu

1
Tôi nghĩ tất cả chúng ta đều là Matt ở đây. Chỉ là phỏng đoán. Nhưng tôi chỉ cố gắng phân biệt câu trả lời của tôi với câu trả lời của bạn. =)
matchew

Vâng, tôi cũng sử dụng tên cơ sở rất nhiều, nó rất tiện lợi =) Nhưng tôi không thể tìm thấy bất cứ điều gì về việc trả lại dir của tệp trên google! Tôi đoán tôi đã không tra cứu những từ phù hợp. Hah, cả 3 chúng tôi Matt đều là người? : D
Matt.

1
Cân nhắc thêm các dấu ngoặc kép cần thiết để đảm bảo rằng các lệnh này hoạt động với các tên có chứa khoảng trắng (ký tự hình cầu, v.v.).
Charles Duffy

3

Sử dụng ${file%/*}như Urvin / LuFFy đề xuất về mặt kỹ thuật là tốt hơn vì bạn sẽ không dựa vào lệnh bên ngoài. Để lấy tên cơ sở giống như cách bạn có thể làm ${file##*/}. Không cần thiết phải sử dụng lệnh bên ngoài trừ khi bạn cần.

file="/stuff/backup/file.zip"
filename=${1##*/}     # file.zip
directory=${1%/*}     # /stuff/backup

Nó cũng sẽ hoàn toàn tuân thủ POSIX theo cách này. Hy vọng nó giúp! :-)


1
một trường hợp dirnamecó lợi thế hơn so với cách tiếp cận tích hợp sẵn (hiệu quả hơn) và đó là nếu bạn không chắc chắn rằng con đường của mình hoàn toàn đủ điều kiện để bắt đầu. Nếu bạn có file=file.zip, dirname "$file"sẽ trở lại ., ${file%/*}ngược lại sẽ trở lại file.zip.
Charles Duffy

1
... tất nhiên, bạn có thể phân nhánh: case $file in */*) dir=${file%/*};; *) dir=.;; esacvẫn là POSIX-y và giải quyết vấn đề.
Charles Duffy

2

Để nhận được directorypathtừ filepath:

file="stuff/backup/file.zip"
dirPath=${file%/*}/
echo ${dirPath}

1

Đơn giản chỉ cần sử dụng $ dirname /home/~username/stuff/backup/file.zip

Nó sẽ trở lại /home/~username/stuff/backup/

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.