2015-05-25 10 views
5

Tôi đang tìm cách để chuẩn hóa đường dẫn tệp tùy ý trong bash, giải quyết ... thành giá trị tuyệt đối của chúng. Ví dụ:Chuẩn hóa đường dẫn tệp tùy ý trong bash trên OSX

> cd /foo/bar 
> normalize_path "." 
/foo/bar 
> normalize_path "../baz" 
/foo/baz 
> normalize_path "../../folder/that/doesnt/exist/" 
/folder/that/doesnt/exist 

Chú ý trong các ví dụ trên, normalize_path trả về một giá trị ngay cả khi con đường không tương ứng với một thư mục thật hay nộp. Tất cả các câu hỏi trước đây về đường dẫn tuyệt đối hoặc chuẩn hóa mà tôi đã thấy trên StackOverflow (example 1, example 2) giả định đường dẫn trỏ đến tệp thực và sử dụng realpath hoặc pwd để bình thường hóa, nhưng điều đó sẽ không hoạt động đối với trường hợp sử dụng của tôi.

Nói cách khác, tôi đang tìm một hàm bash hoàn toàn thao túng đường dẫn dưới dạng chuỗi và không thực sự nhìn vào hệ thống tệp, tương tự như File.getCanonicalPath trong Java.

+3

Phải là duy nhất trong 'bash' hoặc bạn có thể sử dụng' readlink -m your_imaginary_path_here' hoặc 'realpath -m your_imaginary_path_here'? – rickhg12hs

+0

@ rickhg12hs: Tôi đang tìm thứ gì đó chạy trên OS X. –

Trả lời

4

Readlink là cách để đi hoặc trong greadlink trường hợp của bạn. Nó nằm trong gói tiện ích lõi của GNU. "brew cài đặt coreutils" (nếu bạn sử dụng home-brew). Sau đó sử dụng greadlink -m ../my_silly_filename.txt như rickhg12hs nói.

+0

Ah, tôi không biết 'greadlink' có thông số' -m'! Tôi đã thử '-f' như đã được đề xuất trong nhiều câu trả lời khác, và nó không hoạt động nếu tập tin không tồn tại. Nhưng '-m', AKA' --canonicalize-missing' thực hiện chính xác những gì tôi muốn. Cảm ơn! –

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