ฉันสามารถสร้างทางลัดบนเดสก์ท็อป / นามแฝงไปยังโฟลเดอร์จากเทอร์มินัลได้หรือไม่?


16

~/Library/ฉันต้องการที่จะสร้างทางลัดสก์ท็อปไปยังโฟลเดอร์เฉพาะฝังลึกภายใน ไลบรารี่ถูกซ่อนไว้โดยค่าเริ่มต้นใน Lion และฉันต้องการที่จะคงไว้เช่นนั้นด้วยเหตุผลหลายประการ มีการดำเนินการบรรทัดคำสั่งแบบขั้นตอนเดียวที่ฉันสามารถใช้ได้เพื่อสร้างทางลัดบนเดสก์ท็อปไปยังเส้นทางที่กำหนดหรือไม่ ฉันต้องการหลีกเลี่ยงการแก้ปัญหาที่เกี่ยวข้องกับการปลดห้องสมุดสร้าง Alias ​​โดยใช้ Finder และทำการฟื้นฟู ฉันรู้วิธีการทำเช่นนั้น แต่สำหรับจุดประสงค์ของฉันบรรทัดเดียวที่สามารถวางลงในเทอร์มินัลและทำได้ด้วยจะดีกว่า

คำตอบ:


10

ลองใช้เทอร์มินัล:

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

5
ln -s ~/Library/path/to/folder folderฉันคิดว่าคุณหมายถึง ข้อเสียเล็ก ๆ น้อย ๆ อย่างหนึ่งของวิธีนี้ (เช่น symlinking) คือลิงก์จะใช้งานไม่ได้หาก "ดั้งเดิม" (เช่นเป้าหมาย) ถูกย้ายหรือเปลี่ยนชื่อ
เคลวิน

2
folderไม่จำเป็นต้องมีอาร์กิวเมนต์ที่สอง หากคุณข้ามไปให้lnสร้างลิงก์ที่มีชื่อเหมือนกับโฟลเดอร์ดั้งเดิม
Boj

อ่าคุณพูดถูก ฉันได้รับข้อผิดพลาดก่อนหน้านี้ แต่ฉันต้องทำผิดบางอย่าง
เคลวิน

1
ฉันรู้ว่ามันคืออะไร - คุณไม่มีสแลชต่อท้าย!
เคลวิน

12
นามแฝง OSX ไม่ใช่ลิงก์สัญลักษณ์ ดูstackoverflow.com/questions/11165799/…
bfontaine

12

เป็นไปได้ที่จะทำในเทอร์มินัลหนึ่งบรรทัด สมมติว่าคุณต้องการนามแฝงกับไฟล์ "/Users/me/Library/Preferences/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'

คุณควรแทนที่to fileด้วยto folderหากคุณมีโฟลเดอร์

นี่คือเชลล์สคริปต์ที่ให้คุณผ่านไฟล์หรือพา ธ โฟลเดอร์เพื่อสร้างนามแฝง:

#!/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

ถ้าคุณชื่อสคริปต์นี้make-alias.sh, chmod u+x make-alias.shและวางไว้ในคุณสามารถเรียกใช้เช่น/usr/local/binmake-alias.sh ~/Library/Preferences


จะใช้~/Library/Preferences/org.herf.Flux.plist"งานได้หรือต้องรวมชื่อผู้ใช้ไว้ในคำสั่ง Terminal อย่างชัดเจนหรือไม่
LessPop_MoreFizz

ฉันลองใช้~และไม่สามารถใช้osascriptคำสั่งแบบบรรทัดเดียวได้ ฉันแนะนำให้ใช้ไฟล์สคริปต์แทนเพราะไฟล์~จะถูกแปลงโดยอัตโนมัติ
เคลวิน

อืมมม ดูเหมือนว่าจะทำลายชื่อไฟล์ที่มีช่องว่างเช่น/Library/Application Support/
LessPop_MoreFizz

หากคุณใช้สคริปต์ทุบตีคุณควรใส่ชื่อไฟล์ในเครื่องหมายคำพูดเดี่ยวหากมีช่องว่างหรืออักขระพิเศษ อย่างไรก็ตามสิ่งนี้จะป้องกันไม่ให้~ขยาย สิ่งที่ดีที่สุดคือไม่ใช้เครื่องหมายอัญประกาศและแท็บเติมชื่อไฟล์ให้สมบูรณ์ดังนั้นทุบตีจะ "หนี" อักขระพิเศษอย่างถูกต้อง เช่นพิมพ์~/Library/Applicationจากนั้นกดแท็บ หากApplication Supportเป็นการจับคู่เดียวเชลล์ควรแทรกแบ็กสแลชก่อนช่องว่าง นอกจากนี้คุณยังสามารถใช้แบ็กสแลชเพื่อหลบหนีได้ด้วยตนเอง
เคลวิน

โปรดทราบว่าปัญหาช่องว่าง / ตัวอักษรพิเศษจะมีอยู่ในวิธีแก้ปัญหาใด ๆ - เชลล์ไม่สามารถรู้ได้ว่าคุณต้องการส่งผ่านพารามิเตอร์ 1 ตัวแทนที่จะแยกออกเป็น 2 ตัว
เคลวิน

1

ในกรณีที่คุณต้องการกำหนดเป้าหมายลิงก์ที่โฟลเดอร์เฉพาะ (หรือตั้งชื่อเฉพาะ) คุณสามารถใช้set name of result to "…"เหมือนใน

#!/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

คำอธิบายวิธีการทำงานของสคริปต์จะมีประโยชน์
Mark

เหมือนกับสคริปต์ด้านบน แต่ไม่จำเป็นต้องใช้ realpath
Andrew McClure

0

สำหรับผู้ที่ต้องการวิธีการแก้ปัญหาหลามนี่คือ applescript ห่อฟังก์ชั่นแล้วเรียก subprocess.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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.