Câu trả lời:
dirname $file
là những gì bạn đang tìm kiếm
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.
dirname $file
sẽ xuất ra
stuff/backup
ngược lại với basename
:
basename $file
sẽ xuất ra
file.zip
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! :-)
dirname
có 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
.
case $file in */*) dir=${file%/*};; *) dir=.;; esac
vẫn là POSIX-y và giải quyết vấn đề.
Để nhận được directorypath
từ filepath
:
file="stuff/backup/file.zip"
dirPath=${file%/*}/
echo ${dirPath}
Đơ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/
dirname $file