क्या मैं टर्मिनल से एक फोल्डर में डेस्कटॉप शॉर्टकट / एलियास बना सकता हूं?


17

मैं एक विशिष्ट फ़ोल्डर में एक डेस्कटॉप शॉर्टकट बनाना चाहता हूं, जिसे गहरे में दफन किया गया है ~/Library/। लायब्रेरी डिफ़ॉल्ट रूप से लायन में छिपी है, और मैं इसे कई कारणों से रखना चाहूंगा। क्या किसी दिए गए पथ पर एक डेस्कटॉप शॉर्टकट बनाने के लिए, एक-चरण, कमांड लाइन कार्रवाई का उपयोग कर सकता हूं? मैं उन समाधानों से बचना चाहूंगा, जिनमें लाइब्रेरी को अनहाइड करना, फाइंडर का उपयोग करके एलियास बनाना और इसे रिहाइड करना शामिल है। मुझे पता है कि ऐसा कैसे करना है, लेकिन मेरे उद्देश्यों के लिए, एक एकल लाइन जिसे टर्मिनल में चिपकाया जा सकता है और इसके साथ किया जाना बेहतर होगा।

जवाबों:


10

टर्मिनल पर यह कोशिश करें:

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

5
मुझे लगता है कि आपका मतलब था ln -s ~/Library/path/to/folder folder। इस पद्धति का एक छोटा नुकसान (यानी सहानुभूति) यह है कि "मूल" (यानी लक्ष्य) को स्थानांतरित या नाम बदलने पर लिंक टूट जाएगा।
केल्विन

2
दूसरे तर्क folderकी आवश्यकता नहीं है। यदि आप इसे छोड़ देते हैं, lnतो मूल फ़ोल्डर के समान लिंक बनाता है।
बोज

आह, तुम सही हो। मुझे पहले एक त्रुटि मिली, लेकिन मुझे कुछ गलत करना चाहिए।
केल्विन

1
मुझे पता है कि यह क्या था - आप एक अनुगामी स्लेश नहीं कर सकते हैं!
केल्विन

12
OSX उपनाम प्रतीकात्मक लिंक नहीं हैं । देखें stackoverflow.com/questions/11165799/...
bfontaine

13

यह टर्मिनल की एक पंक्ति में करना संभव है। मान लें कि आप "/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/bin, तो आप उदाहरण के लिए चला सकते हैं make-alias.sh ~/Library/Preferences


~/Library/Preferences/org.herf.Flux.plist"काम करेगा , या क्या उपयोगकर्ता नाम को टर्मिनल कमांड में स्पष्ट रूप से शामिल करने की आवश्यकता है?
लेसपोप_मोरफिज़

मैंने सिर्फ उपयोग करने की कोशिश की ~और यह एक-लाइन osascriptकमांड के साथ काम नहीं करता है । मैं इसके बजाय स्क्रिप्ट फ़ाइल का उपयोग करने का सुझाव देता हूं, क्योंकि ~स्वचालित रूप से परिवर्तित हो जाता है।
केल्विन

हम्म। रिक्त स्थान के साथ फ़ाइल नाम पर तोड़ने के लिए लगता है जैसे/Library/Application Support/
LessPop_MoreFizz

यदि आप बैश स्क्रिप्ट का उपयोग कर रहे हैं, तो आपको किसी भी स्थान या विशेष वर्ण होने पर फ़ाइलनाम को एकल उद्धरण में रखना चाहिए। हालाँकि, यह ~विस्तारित होने से रोकेगा । सबसे अच्छी बात यह है कि उद्धरणों का उपयोग न करें, और फ़ाइल नाम को पूरा करने के लिए बैश ठीक से विशेष वर्णों से "बच" जाएगा। जैसे टाइप करें ~/Library/Applicationफिर टैब दबाएं। यदि Application Supportएकमात्र मैच था, तो शेल को अंतरिक्ष से पहले बैकस्लैश डालना चाहिए था। बचने के लिए आप मैन्युअल रूप से बैकस्लैश का भी उपयोग कर सकते हैं।
केल्विन

ध्यान दें कि रिक्त स्थान / विशेष आकर्षण समस्या किसी भी समाधान में मौजूद होगी - शेल को यह पता नहीं चल सकता है कि आपको 2 अलग-अलग लोगों के बजाय 1 पैरामीटर पास करना था।
केल्विन

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

स्क्रिप्ट कैसे काम करती है, इसका एक स्पष्टीकरण
user151019

ऊपर स्क्रिप्ट के रूप में एक ही है, लेकिन realpath की आवश्यकता के बिना
एंड्रयू McClure

0

उन लोगों के लिए जो एक अजगर समाधान चाहते हैं, यहाँ एक फ़ंक्शन रैपिंग एप्सस्क्रिप्ट है, फिर सबप्रोसेस। कॉल:

def applescript_finder_alias(theFrom, theTo):
    """
    (theFrom, theTo)
    create a short/alias
    theFrom, theTo: relative or abs path, both folder or both file
    """
    # /apple/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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.