2010-07-20 45 views
147

Tôi đang cố gắng viết một móc hậu móc cho SVN, được lưu trữ trên máy chủ phát triển của chúng tôi. Mục tiêu của tôi là cố gắng tự động kiểm tra một bản sao của dự án đã cam kết vào thư mục mà nó được lưu trữ trên máy chủ. Tuy nhiên tôi cần để có thể chỉ đọc thư mục cuối cùng trong chuỗi thư mục được truyền cho kịch bản để kiểm tra cùng một thư mục con nơi các dự án của chúng tôi được lưu trữ.Bash - lấy tên dirname/tên tệp cuối cùng trong đối số đường dẫn tệp

Ví dụ: nếu tôi thực hiện SVN cam kết với dự án "example", tập lệnh của tôi nhận "/ usr/local/svn/repos/example" làm đối số đầu tiên của nó. Tôi cần phải nhận được chỉ là "ví dụ" ra khỏi cuối chuỗi và sau đó concat nó với một chuỗi để tôi có thể kiểm tra "/ server/root/example" và xem những thay đổi sống ngay lập tức.

Trả lời

232

basename không loại bỏ các tiền tố thư mục của một con đường:

$ basename /usr/local/svn/repos/example 
example 
$ echo "/server/root/$(basename /usr/local/svn/repos/example)" 
/server/root/example 
+2

tên gốc chắc chắn là những gì tôi đang tìm kiếm. Làm thế nào có thể nhận được tên cơ sở của một đối số được lưu trữ vào một biến mặc dù? Ví dụ. 'SUBDIR ="/path/to/whatever/$ (tên cơ bản $ 1) "' – tj111

+0

Tôi gặp lỗi "basename: missing operand" – tj111

+4

@ tj111: âm thanh như không có '$ 1' hoặc' $ 1' trống rỗng – sth

54

Bash có thể nhận được phần cuối của một con đường mà không cần phải gọi bên ngoài basename:

subdir="/path/to/whatever/${1##*/}" 
+2

Trên máy Mac của tôi, sử dụng ký hiệu chuỗi con là nhiều hơn thứ tự của cường độ nhanh hơn dirname/basename cho trường hợp bạn đang làm một cái gì đó tầm thường cho mỗi một vài nghìn tập tin. – George

+0

Điều này không hoạt động chút nào khi "/ path/to/whatever /" của tôi là một biến. –

+0

@ButtleButkus: Chỉ cho tôi những gì bạn đã làm và những gì bạn mong đợi là kết quả, bởi vì nó sẽ hoạt động. –

49

Các phương pháp sau đây có thể được sử dụng để nhận bất kỳ đường dẫn nào của tên đường dẫn:

pathname=a/b/c 
echo $(basename $pathname) 
echo $(basename $(dirname $pathname)) 
echo $(basename $(dirname $(dirname $pathname))) 

Đầu ra:

c 
b 
a 
Các vấn đề liên quan