Trong Bash, nếu VAR="/home/me/mydir/file.c"
, làm thế nào để tôi có được "/home/me/mydir"
?
Trong Bash, nếu VAR="/home/me/mydir/file.c"
, làm thế nào để tôi có được "/home/me/mydir"
?
Câu trả lời:
dirname
và basename
là các công cụ bạn đang tìm kiếm để trích xuất các thành phần đường dẫn:
$ VAR=/home/me/mydir/file.c
$ DIR=$(dirname "${VAR}")
$ echo "${DIR}"
/home/me/mydir
$ basename "${VAR}"
file.c
Chúng không phải là các lệnh Bash bên trong mà là một phần của tiêu chuẩn POSIX (xem dirname
, basename
) và do đó nên có sẵn trên phần lớn các hệ thống sẽ chạy Bash.
$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir
$ echo "${VAR##*/}"
file.c
Để tránh phụ thuộc với basename
vàdirname
Trên một lưu ý liên quan, nếu bạn chỉ có tên tệp hoặc đường dẫn tương đối, thì dirname
nó sẽ không giúp ích gì. Đối với tôi, câu trả lời cuối cùng đã được readlink
.
fname='txtfile'
echo $(dirname "$fname") # output: .
echo $(readlink -f "$fname") # output: /home/me/work/txtfile
Sau đó, bạn có thể kết hợp cả hai để có được thư mục.
echo $(dirname $(readlink -f "$fname")) # output: /home/me/work
readlink -m "$fname"
để chuẩn hóa tên được đặt theo cách đệ quy
Nếu bạn quan tâm các tệp mục tiêu là liên kết tượng trưng, trước tiên bạn có thể kiểm tra nó và lấy tệp gốc. Mệnh đề if dưới đây có thể giúp bạn.
if [ -h $file ]
then
base=$(dirname $(readlink $file))
else
base=$(dirname $file)
fi
Tôi đã chơi với điều này và đưa ra một giải pháp thay thế.
$ VAR=/home/me/mydir/file.c
$ DIR=`echo $VAR |xargs dirname`
$ echo $DIR
/home/me/mydir
Phần tôi thích là dễ dàng mở rộng sao lưu cây:
$ DIR=`echo $VAR |xargs dirname |xargs dirname |xargs dirname`
$ echo $DIR
/home