Tôi có thể tạo Shortcut / Alias ​​cho Thư mục từ Terminal không?


17

Tôi muốn tạo một lối tắt trên màn hình cho một thư mục cụ thể, ẩn sâu bên trong ~/Library/. Thư viện được ẩn theo mặc định trong Lion và tôi muốn giữ nguyên như vậy, vì nhiều lý do. Có một hành động dòng lệnh một bước, tôi có thể sử dụng, để tạo lối tắt trên màn hình cho một đường dẫn cụ thể không? Tôi muốn tránh các giải pháp liên quan đến việc bỏ ẩn Thư viện, tạo Bí danh bằng Finder và khôi phục nó. Tôi biết làm thế nào để làm điều đó, nhưng với mục đích của tôi, một dòng duy nhất có thể được dán vào Terminal và được thực hiện với nó sẽ tốt hơn.

Câu trả lời:


10

Hãy thử điều này trên Terminal:

cd ~/Desktop
ln -s ~/Library/path/to/folder

5
Tôi nghĩ bạn có ý đó ln -s ~/Library/path/to/folder folder. Một nhược điểm nhỏ của phương pháp này (tức là liên kết tượng trưng) là liên kết sẽ bị phá vỡ nếu "bản gốc" (tức là mục tiêu) bị di chuyển hoặc đổi tên.
Kelvin

2
Đối số thứ hai folderlà không bắt buộc. Nếu bạn bỏ qua nó, hãy lntạo một liên kết có tên giống như thư mục gốc.
Boj

À, bạn nói đúng. Tôi đã có một lỗi trước đây, nhưng tôi phải nhầm lẫn một cái gì đó.
Kelvin

1
Tôi biết nó là gì - bạn không thể có dấu gạch chéo!
Kelvin

12
Bí danh OSX không phải là liên kết tượng trưng. Xem stackoverflow.com/questions/11165799/
Mạnh

12

Có thể làm điều đó trong một dòng của Terminal. Giả sử bạn muốn đặt bí danh cho tệp "/Users/me/L Library / Peferences / org.herf.Flux.plist".

osascript -e 'tell application "Finder"' -e 'make new alias to file (posix file "/Users/me/Library/Preferences/org.herf.Flux.plist") at desktop' -e 'end tell'

Bạn nên thay thế to filebằng to foldernếu bạn có một thư mục.

Đây là tập lệnh shell cho phép bạn truyền vào đường dẫn tệp hoặc thư mục để tạo bí danh:

#!/bin/bash

if [[ -f "$1" ]]; then
  type="file"
else
  if [[ -d "$1" ]]; then 
    type="folder"
  else
    echo "Invalid path or unsupported type"
    exit 1
  fi
fi

osascript <<END_SCRIPT
tell application "Finder"
   make new alias to $type (posix file "$1") at desktop
end tell
END_SCRIPT

Nếu bạn đặt tên cho kịch bản này make-alias.sh, chmod u+x make-alias.shvà đặt nó trong /usr/local/bin, bạn có thể chạy ví dụ make-alias.sh ~/Library/Preferences.


Sẽ ~/Library/Preferences/org.herf.Flux.plist"hoạt động, hoặc tên người dùng cần phải được bao gồm rõ ràng trong lệnh Terminal?
LessPop_MoreFizz

Tôi vừa thử sử dụng ~và nó không hoạt động với lệnh một dòng osascript. Tôi đề nghị sử dụng tệp script thay vào đó, vì ~nó được chuyển đổi tự động.
Kelvin

Hừm. Có vẻ như phá vỡ tên tệp với các khoảng trắng như/Library/Application Support/
LessPop_MoreFizz

Nếu bạn đang sử dụng tập lệnh bash, bạn nên đặt tên tệp trong dấu ngoặc đơn nếu nó có bất kỳ khoảng trắng hoặc ký tự đặc biệt nào. Tuy nhiên, điều này sẽ ngăn chặn ~được mở rộng. Điều tốt nhất là không sử dụng dấu ngoặc kép và để tab hoàn thành tên tệp để bash sẽ "thoát" đúng các ký tự đặc biệt. Ví dụ gõ ~/Library/Applicationrồi nhấn tab. Nếu Application Supportlà kết quả khớp duy nhất, shell sẽ chèn một dấu gạch chéo ngược trước khoảng trắng. Bạn cũng có thể tự sử dụng dấu gạch chéo ngược để thoát.
Kelvin

Lưu ý rằng vấn đề khoảng trắng / ký tự đặc biệt sẽ tồn tại trong bất kỳ giải pháp nào - trình bao không thể biết rằng bạn có nghĩa là truyền 1 tham số thay vì 2 tham số riêng biệt.
Kelvin

1

Trong trường hợp bạn cần nhắm mục tiêu liên kết tại một thư mục cụ thể (hoặc đặt tên cụ thể), bạn có thể sử dụng set name of result to "…"như trong

#!/bin/bash

if [[ $# -ne 2 ]]; then
    echo "mkalias: specify 'from' and 'to' paths" >&2
    exit 1
fi

from="$(realpath $1)"
todir="$(dirname $(realpath $2))"
toname="$(basename $(realpath $2))"
if [[ -f "$from" ]]; then
    type="file"
elif [[ -d "$from" ]]; then
    type="folder"
else
    echo "mkalias: invalid path or unsupported type: '$from'" >&2
    exit 1
fi

osascript <<EOF
tell application "Finder"
   make new alias to $type (posix file "$from") at (posix file "$todir")
   set name of result to "$toname"
end tell
EOF

1
#!/bin/bash

get_abs() {
  # $1 : relative filename
  echo "$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
}


if [[ $# -ne 2 ]]; then
    echo "mkalias: specify 'from' and 'to' paths" >&2
    exit 1
fi

from=$(eval get_abs $1)  
todir=$(dirname $(eval get_abs $2))
toname=$(basename $(eval get_abs $2))
if [[ -f "$from" ]]; then
    type="file"
elif [[ -d "$from" ]]; then
    type="folder"
else
    echo "mkalias: invalid path or unsupported type: '$from'" >&2
    exit 1
fi

osascript <<EOF
tell application "Finder"
   make new alias to $type (posix file "$from") at (posix file "$todir")
   set name of result to "$toname"
end tell
EOF

Một lời giải thích về cách hoạt động của kịch bản sẽ hữu ích
Đánh dấu

Tương tự như kịch bản ở trên nhưng không cần thông cảm
Andrew McClure

0

Đối với những người muốn có một giải pháp python, đây là một hàm gói applescript, sau đó gọi sub process.call:

def applescript_finder_alias(theFrom, theTo):
    """
    (theFrom, theTo)
    create a short/alias
    theFrom, theTo: relative or abs path, both folder or both file
    """
    # https://apple.stackexchange.com/questions/51709
    applescript = '''
    tell application "Finder"
       make new alias to %(theType)s (posix file "%(theFrom)s") at (posix file "%(todir)s")
       set name of result to "%(toname)s"
    end tell
    '''
    def myesp(cmdString):
        import os, inspect, tempfile, subprocess
        caller = inspect.currentframe().f_back
        cmd =  cmdString % caller.f_locals

        fd, path = tempfile.mkstemp(suffix='.applescript')
        try:
            with os.fdopen(fd, 'w') as tmp:
                tmp.write(cmd.replace('"','\"').replace("'","\'")+'\n\n')
            subprocess.call('osascript ' + path, shell=True, executable="/bin/bash")
        finally:
            os.remove(path)
        return None
    import os
    theFrom = os.path.abspath(theFrom)
    theTo = os.path.abspath(theTo)
    if os.path.isfile(theFrom): 
        theType = 'file'
    else:
        theType = 'folder'
    todir = os.path.dirname(theTo)
    toname = os.path.basename(theTo)
    myesp(applescript)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.