จะไปนามแฝงจากเทอร์มินัลได้อย่างไร


9

โดยนามแฝงฉันหมายถึงทางลัดโฟลเดอร์ที่สร้างขึ้นเมื่อคุณคลิกขวาที่โฟลเดอร์ใน Finder และเลือก "Make Alias" ฉันสามารถสำรวจการเชื่อมโยงสัญลักษณ์ในขั้วแต่มันไม่ทำงานบนนามแฝง:cd bash: cd: example-alias: Not a directoryเป็นไปได้ไหมที่จะเปลี่ยนไดเรกทอรีเป็นปลายทางของนามแฝงใน Terminal


ฉันได้อัปเดตคำตอบแล้ว
markhunte

คำตอบ:


5

ต้องการเปิดใช้งาน cd'ing เป็นนามแฝงโฟลเดอร์ที่ฉันได้พบต่อไปนี้ที่Mac OS X คำแนะนำ

รวบรวมซอร์สโค้ดด้านล่างด้วยคำสั่งต่อไปนี้:

gcc -o getTrueName -framework Carbon getTrueName.c

สิ่งนี้จะสร้างไฟล์ปฏิบัติการ 'getTrueName' ในไดเรกทอรีเดียวกันกับแหล่งที่มา คุณสามารถเพิ่มลงใน PATH ของคุณหรือคัดลอกโดยตรงไปยัง / usr / bin หรือ / usr / local / bin เพื่อให้เข้าถึงได้ง่าย

ซอร์สโค้ด Cสำหรับ getTrueName (คัดลอกข้อความและบันทึกไฟล์เป็น getTrueName.c ในโฮมไดเร็กทอรีของคุณ):

// getTrueName.c
// 
// DESCRIPTION
//   Resolve HFS and HFS+ aliased files (and soft links), and return the
//   name of the "Original" or actual file. Directories have a "/"
//   appended. The error number returned is 255 on error, 0 if the file
//   was an alias, or 1 if the argument given was not an alias
// 
// BUILD INSTRUCTIONS
//   gcc-3.3 -o getTrueName -framework Carbon getTrueName.c 
//
//     Note: gcc version 4 reports the following warning
//     warning: pointer targets in passing argument 1 of 'FSPathMakeRef'
//       differ in signedness
//
// COPYRIGHT AND LICENSE
//   Copyright 2005 by Thos Davis. All rights reserved.
//   This program is free software; you can redistribute it and/or
//   modify it under the terms of the GNU General Public License as
//   published by the Free Software Foundation; either version 2 of the
//   License, or (at your option) any later version.
//
//   This program is distributed in the hope that it will be useful, but
//   WITHOUT ANY WARRANTY; without even the implied warranty of
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
//   General Public License for more details.
//
//   You should have received a copy of the GNU General Public
//   License along with this program; if not, write to the Free
//   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
//   MA 02111-1307 USA


#include <Carbon/Carbon.h> 
#define MAX_PATH_SIZE 1024
#define CHECK(rc,check_value) if ((check_value) != noErr) exit((rc))

int main ( int argc, char * argv[] ) 
  { 
    FSRef               fsRef; 
    Boolean             targetIsFolder; 
    Boolean             wasAliased; 
    UInt8               targetPath[MAX_PATH_SIZE+1]; 
    char *              marker;

    // if there are no arguments, go away
    if (argc < 2 ) exit(255); 

    CHECK( 255,
      FSPathMakeRef( argv[1], &fsRef, NULL ));

    CHECK( 1,
      FSResolveAliasFile( &fsRef, TRUE, &targetIsFolder, &wasAliased));

    CHECK( 255,
      FSRefMakePath( &fsRef, targetPath, MAX_PATH_SIZE)); 

    marker = targetIsFolder ? "/" : "" ;
    printf( "%s%s\n", targetPath, marker ); 

    exit( 1 - wasAliased );
  }

รวมสิ่งต่อไปนี้ใน ~ / .bash_profile หรือสร้างไฟล์ใหม่ ~ / .bash_profile ด้วยเนื้อหาต่อไปนี้:

function cd {
  if [ ${#1} == 0 ]; then
    builtin cd
  elif [ -d "${1}" ]; then
    builtin cd "${1}"
  elif [[ -f "${1}" || -L "${1}" ]]; then
    path=$(getTrueName "$1")
    builtin cd "$path"
  else
    builtin cd "${1}"
  fi
}

คุณอาจต้องรีสตาร์ท Terminal เพื่อโหลด. bash_profile ที่แก้ไข

ผ่านการทดสอบใน Yosemite 10.10.2 & gcc 4.2 (Xcode 6.2) และใช้งานได้

วิธีการที่คล้ายกันมีอยู่ที่superuser.com


3

ฉันยังไม่ได้ทดสอบคำตอบโดย @klanomath แต่เคยเป็นห้องสมุด Python เพื่อให้ได้เป้าหมายของนามแฝง แต่การสนับสนุน Carbon ถูกลบออกจากเฟรมเวิร์กของ Apple ก็สามารถทำได้ในวัตถุประสงค์ C ดูhttps://stackoverflow.com/a/21151368/838253

ทางออกที่ดีที่สุดคือการใช้ symlink แต่น่าเสียดายที่ Finder ไม่อนุญาตให้คุณสร้างสิ่งเหล่านี้

ฉันได้เขียนบริการ OS X ซึ่งสร้าง symlink (ซึ่งรองรับทั้ง Finder และ Terminal) สิ่งนี้จะรันสคริปต์ทุบตีต่อไปนี้ในเวิร์กโฟลว์ Finder (น่าเสียดายที่ไม่สามารถโพสต์โค้ด Automator ในรูปแบบที่อ่านได้)

for f in "$@"
do
 fileSuffix="link"
 fileExists=`ls -d "$f $fileSuffix"`
 fileNumber=0

 until [ $fileExists=="" ]; do
  let fileNumber+=1
  fileSuffix="link $fileNumber"
  fileExists=`ls -d "$f $fileSuffix"`
 done

 echo "$f $fileSuffix"
 ln -s "$f" "$f $fileSuffix"
done

1
ในหนึ่งประโยคคุณพูดว่า"ทางออกที่ดีที่สุดคือการใช้ symlink แต่น่าเสียดายที่ Finder ไม่สนับสนุนสิ่งนี้" และจากนั้นพูดว่า"... ซึ่งสร้าง symlink (ซึ่งรองรับทั้ง Finder และ Terminal)"และสิ่งเหล่านี้ดูเหมือนจะขัดแย้งกันดังนั้นให้พิจารณาเขียนใหม่ตามที่"Finder ไม่สนับสนุนสิ่งนี้"มีความทะเยอทะยาน นอกจากนี้ตัวแปรcurFolderและlinkFileยังไม่ได้ใช้ดังนั้นทำไมจึงมี ควรมีช่องว่างรอบตัวดำเนินการเปรียบเทียบเช่น$fileExists == ""และพิจารณาใช้$(..)แทน backticks ดั้งเดิม
user3439894

@ user3439894 เปลี่ยนถ้อยคำ คุณถูกต้องเกี่ยวกับรหัส ฉันเขียนสิ่งนี้ในปี 2011 ไม่นานหลังจากที่ฉันได้ Mac และมันใช้งานได้และฉันไม่ได้ดูตั้งแต่นั้น ตัวแปรที่ไม่ได้ใช้อาจเหลือจากการทดสอบ
Milliways

3

นี่คือสิ่งที่ฉันทำ

เพิ่มและโหลดฟังก์ชันนี้ใน. profile ของคุณ

function cd  {
  thePath=`osascript <<EOD
set toPath to ""
tell application "Finder"
    set toPath to (POSIX file "$1") as alias
    set theKind to kind of toPath
    if theKind is "Alias" then
        set toPath to  ((original item of toPath) as alias)
    end if
end tell
return posix path of (toPath)
EOD`
  builtin cd "$thePath";
}

ปรับปรุง

ฉันใช้ builtin cd บรรทัดที่แสดงในคำตอบ @klanomath ซึ่งช่วยให้คุณสามารถแทนที่คำสั่ง cd ดังนั้นตอนนี้เราสามารถใช้:

cd /path/to/example-alias

หรือ

cd /path/to/example

ฟังก์ชั่นควรกลับและ cd ไปที่เส้นทางเดิมของนามแฝงเดิมหรือเส้นทางปกติ


1

ในขณะที่ลิงก์สัญลักษณ์ (นามแฝง UNIX) ดูเหมือนกับ Finder alias ภายใน Finder พวกเขาเป็นนามแฝงที่แตกต่างกันสองประเภท

ลิงก์สัญลักษณ์จะเก็บพา ธ ที่นำไปสู่และจะทำลายอย่างถาวรหรือชั่วคราวถ้าทรัพยากรถูกย้ายหรือบนไดรฟ์ที่ยกเลิกการเชื่อมต่อหรือแชร์ตามลำดับ

นามแฝง Finder เป็นเทคนิคไฟล์ธรรมดาที่มีคำแนะนำสำหรับ Finder ตัวค้นหาสามารถใช้ข้อมูลนี้เพื่อค้นหาไฟล์ / ไดเร็กทอรีเป้าหมายที่ถูกย้ายในระดับหนึ่ง หากทรัพยากรเป้าหมายของนามแฝงอยู่บนจุดเชื่อมต่อเครือข่ายที่ติดตั้งอยู่มันจะเก็บข้อมูลของรายการ Keychain ที่จะใช้เพื่อเข้าสู่ระบบของคุณในจุดที่ใช้ร่วมกันเพื่อเปิด

ดังนั้นหากคุณไม่เขียนสคริปต์หรือโปรแกรมเพื่ออ่านไฟล์ Finder alias มันจะไม่ใช้เป็นไดเรกทอรี แต่เป็นไฟล์ใน Terminal

หรือคุณสามารถลบนามแฝง Finder ปัจจุบันและสร้างลิงก์สัญลักษณ์แทน คำสั่งจะln -s /path/to/originalสร้างลิงก์สัญลักษณ์ที่ไดเรกทอรีปัจจุบัน เส้นทางสามารถเป็นเส้นทางแบบเต็มหรือแบบสัมพัทธ์


1
  1. applescript ของ @ markhunte ทำงานได้ แต่มีข้อความเตือน: osascript[9807:7154723] CFURLGetFSRef was passed an URL which has no scheme (the URL will not work with other CFURL routines)

ด้วยความช่วยเหลือของเคล็ดลับนี้ฉันได้แก้ไข applescript ของ @ markunte เพื่อลบข้อความเตือนข้างต้น

  1. applescript ของ @ markhunte ช้าเล็กน้อยเนื่องจากจะเรียกใช้ applescript เสมอ ดังนั้นต่อไปนี้คำแนะนำของ @ klanomath ซึ่งอยู่ในรายการด้านบนฉันแก้ไขสคริปต์เพื่อเรียกใช้ applescript เฉพาะเมื่อวัตถุเป้าหมายเป็นนามแฝง
# Overriding cd to enable make alias available in CLI

function cd  {
    if [ ${#1} == 0 ]; then
        builtin cd
    elif [ -d "${1}" ]; then
        builtin cd "${1}"
    elif [[ -f "${1}" || -L "${1}" ]]; then
        thePath=`osascript <<EOD
set toPath to ""
tell application "Finder"
    set toPath to (POSIX file ((do shell script "pwd")&"/$1")) as alias
    set theKind to kind of toPath
    if theKind is "Alias" then
        set toPath to  ((original item of toPath) as alias)
    end if
end tell
return posix path of (toPath)
EOD`
        builtin cd "$thePath";
    else
        builtin cd "${1}"
    fi
}

-2

เช่นเดียวกับระบบปฏิบัติการส่วนใหญ่ (นอกเหนือจาก Windows) OS X รองรับสคริปต์ Bash ขั้นแรกสร้างไฟล์บนเดสก์ท็อปของคุณ (หรือตำแหน่งที่คุณต้องการ):

แตะ ~ / Desktop / PlexConnect.sh ถัดไปตั้งค่าการอนุญาตของไฟล์เพื่อให้สามารถเรียกใช้งานได้:

chmod + x ~ / Desktop / PlexConnect.sh จากนั้นคุณสามารถแก้ไขเนื้อหาของสคริปต์ด้วยโปรแกรมแก้ไขข้อความที่คุณเลือกให้แน่ใจว่ามันเริ่มต้นด้วยบรรทัดต่อไปนี้เพื่อให้ระบบรู้ว่าจะเรียกใช้โดยใช้เชลล์ (Bash):

! / bin / ทุบตี

ไฟล์สามารถคลิกสองครั้งเปิดใช้ Terminal และดำเนินการ

อย่างไรก็ตามโซลูชันที่สวยงามกว่านี้อาจสร้างแอปพลิเคชั่น AppleScript ที่รันคำสั่งให้คุณ เปิดแอปพลิเคชัน "ตัวแก้ไขสคริปต์" และวางในสิ่งต่อไปนี้:

ทำเชลล์สคริปต์ "/Applications/PlexConnect-master/PlexConnect.py" ด้วยสิทธิ์ผู้ดูแลระบบบันทึกสิ่งนี้เป็น "แอปพลิเคชัน" ตั้งชื่อสิ่งที่คุณต้องการ เมื่อเปิดมันจะให้พรอมต์รหัสผ่านมาตรฐานของ OS X รันสคริปต์จากนั้นปิดตัวเอง


นี่ตอบคำถามที่ถามด้านบนได้อย่างไร คุณสามารถแก้ไขการจัดรูปแบบโพสต์ของคุณได้อย่างไร
nohillside

สิ่งนี้เกี่ยวข้องกับนามแฝงตามที่ถามในคำถามโปรดจัดรูปแบบคำตอบของคุณตามที่อธิบายไว้ในศูนย์ช่วยเหลือapple.stackexchange.com/help/formatting
user151019
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.