Giả sử tôi có một tập tin /from/here/to/there.txt
, và muốn nhận được chỉ là phần cuối cùng của dirname của nó to
thay vì /from/here/to
, những gì tôi nên làm gì?
Giả sử tôi có một tập tin /from/here/to/there.txt
, và muốn nhận được chỉ là phần cuối cùng của dirname của nó to
thay vì /from/here/to
, những gì tôi nên làm gì?
Câu trả lời:
Bạn có thể sử dụng basename
mặc dù nó không phải là một tệp. Loại bỏ tên tệp bằng cách sử dụng dirname
, sau đó sử dụng basename
để lấy phần tử cuối cùng của chuỗi:
dir="/from/here/to/there.txt"
dir="$(dirname $dir)" # Returns "/from/here/to"
dir="$(basename $dir)" # Returns just "to"
dir
khi tôi đặt nó.
Ngược lại với dirname
là basename
:
basename "$(dirname "/from/here/to/there.txt")"
Sử dụng bash
các hàm chuỗi:
$ s="/from/here/to/there.txt"
$ s="${s%/*}" && echo "${s##*/}"
to
Sử dụng mở rộng tham số Bash , bạn có thể làm điều này:
path="/from/here/to/there.txt"
dir="${path%/*}" # sets dir to '/from/here/to' (equivalent of dirname)
last_dir="${dir##*/}" # sets last_dir to 'to' (equivalent of basename)
Điều này hiệu quả hơn vì không có lệnh bên ngoài nào được sử dụng.
Cách BASH tinh khiết:
s="/from/here/to/there.txt"
[[ "$s" =~ ([^/]+)/[^/]+$ ]] && echo "${BASH_REMATCH[1]}"
to
.
. Sẽ không hoạt động nếu thư mục có dấu chấm .
. Giữ cho nó đơn giản và sử dụng dấu gạch chéo /
làm dấu phân cách.
Một awk
cách để làm điều đó sẽ là:
awk -F'/' '{print $(NF-1)}' <<< "/from/here/to/there.txt"
Giải trình:
-F'/'
đặt dấu phân tách trường là "/"$(NF-1)
<<<
sử dụng bất kỳ thứ gì sau nó làm đầu vào tiêu chuẩn ( wiki giải thích )Một cách nữa
IFS=/ read -ra x <<<"/from/here/to/there.txt" && printf "%s\n" "${x[-2]}"
printf "%s\n" "${x[-2]}"
.
Câu hỏi này là một cái gì đó như thế này .
Để giải quyết điều đó bạn có thể làm:
DirPath="/from/here/to/there.txt"
DirPath="$(dirname $DirPath)"
DirPath="$(basename $DirPath)"
echo "$DirPath"
Như bạn tôi đã nói điều này cũng có thể xảy ra:
basename `dirname "/from/here/to/there.txt"`
Để có được bất kỳ phần nào của con đường của bạn, bạn có thể làm:
echo "/from/here/to/there.txt" | awk -F/ '{ print $2 }'
OR
echo "/from/here/to/there.txt" | awk -F/ '{ print $3 }'
OR
etc
Câu trả lời hàng đầu là hoàn toàn chính xác cho câu hỏi được đặt ra. Trong một trường hợp chung chung hơn với thư mục cần thiết nằm giữa một đường dẫn dài, cách tiếp cận này dẫn đến một đoạn mã khó đọc. Ví dụ :
dir="/very/long/path/where/THIS/needs/to/be/extracted/text.txt"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(basename $dir)"
Trong trường hợp này, người ta có thể sử dụng:
IFS=/; set -- "/very/long/path/where/THIS/needs/to/be/extracted/text.txt"; set $1; echo $6
THIS