2009-07-23 42 views
6

Tôi đang viết tập lệnh shell sẽ rsync các tệp từ máy từ xa, một số linux, một số máy mac, đến máy chủ sao lưu trung tâm. Các máy Mac có các thư mục ở cấp cơ sở chứa bí danh của tất cả các tệp/thư mục cần được sao lưu. Một lệnh terminal mà tôi có thể sử dụng để giải quyết đường dẫn đến các tệp/thư mục mà các bí danh trỏ tới là gì? (Tôi sẽ cần phải vượt qua những con đường để rsync)Lệnh thiết bị đầu cuối OS X để xử lý đường dẫn của một bí danh

Trả lời

3

Tôi thấy kịch bản sau đây mà làm những gì tôi cần:

#!/bin/sh 
if [ $# -eq 0 ]; then 
    echo "" 
    echo "Usage: $0 alias" 
    echo " where alias is an alias file." 
    echo " Returns the file path to the original file referenced by a" 
    echo " Mac OS X GUI alias. Use it to execute commands on the" 
    echo " referenced file. For example, if aliasd is an alias of" 
    echo " a directory, entering" 
    echo ' % cd `apath aliasd`' 
    echo " at the command line prompt would change the working directory" 
    echo " to the original directory." 
    echo "" 
fi 
if [ -f "$1" -a ! -L "$1" ]; then 
    # Redirect stderr to dev null to suppress OSA environment errors 
    exec 6>&2 # Link file descriptor 6 with stderr so we can restore stderr later 
    exec 2>/dev/null # stderr replaced by /dev/null 
    path=$(osascript << EOF 
tell application "Finder" 
set theItem to (POSIX file "${1}") as alias 
if the kind of theItem is "alias" then 
get the posix path of ((original item of theItem) as text) 
end if 
end tell 
EOF 
) 
    exec 2>&6 6>&-  # Restore stderr and close file descriptor #6. 

    echo "$path" 
fi 
+0

Điều này là miễn là mục gốc có thể được truy cập tại thời điểm tập lệnh được chạy. Nó không hoạt động nếu bí danh bị hỏng hoặc khối lượng không thể được gắn kết. Tôi đã thêm liên kết vào một công cụ có thể hoạt động trong các trường hợp đó trong câu trả lời khác http://stackoverflow.com/a/17570232/425078 – rptb1

+0

tại sao tất cả sao chép và khôi phục fd 2 hiện có? tại sao không chỉ nói 'path = $ (osascript 2>/dev/null << EOF ...)' – dubiousjim

+0

@dubiousjim sẽ sạch hơn. Tôi không viết kịch bản này; Tôi tìm thấy nó trực tuyến. Điều đó đang được nói, tôi sẽ kiểm tra đề xuất của bạn và cập nhật câu trả lời – Josh

3

tôi đã tìm thấy this tool.

Một chút mã được biên dịch, một hàm trong số .bash_profile và voila của bạn. Xử lý các bí danh trong suốt, chỉ cần sử dụng "cd". Nhanh hơn vài lần so với sử dụng Applescript.

+0

Phần hữu ích của liên kết của bạn (công cụ này): 'getTrueName.c' không còn khả dụng ở đó nữa. –

+1

@danielAzuelos cảm ơn vì đã cho tôi biết! Tôi đã tweet tại tác giả, liên kết đã được sửa. – Groxx

7

Tôi gặp vấn đề này và vì vậy tôi đã triển khai một công cụ dòng lệnh. Mã nguồn mở tại https://github.com/rptb1/aliasPath

Điều quan trọng là nó sẽ hoạt động ngay cả khi bí danh bị hỏng, không giống như bất kỳ giải pháp AppleScript nào mà tôi đã tìm thấy. Do đó, bạn có thể sử dụng nó để viết kịch bản để sửa các bí danh khi nhiều tệp thay đổi âm lượng. Đó là lý do tại sao tôi đã viết nó.

Mã nguồn rất ngắn, nhưng đây là bản tóm tắt phần quan trọng, cho bất kỳ ai khác cần giải quyết vấn đề này trong mã, hoặc ai muốn tra cứu các giao thức liên quan.

NSString *aliasPath = [NSString stringWithUTF8String:posixPathToAlias]; 
NSURL *aliasURL = [NSURL fileURLWithPath:aliasPath]; 
NSError *error; 
NSData *bookmarkData = [NSURL bookmarkDataWithContentsOfURL:aliasURL error:&error]; 
NSDictionary *values = [NSURL resourceValuesForKeys:@[NSURLPathKey] 
            fromBookmarkData:bookmarkData]; 
NSString *path = [values objectForKey:NSURLPathKey]; 
const char *s = [path UTF8String]; 
Các vấn đề liên quan