Làm thế nào để đi đến bí danh từ thiết bị đầu cuối?


9

Theo bí danh, ý tôi là lối tắt thư mục được tạo khi bạn nhấp chuột phải vào thư mục trong Finder và chọn "Make Alias". Tôi có thể duyệt qua các liên kết tượng trưng trong Terminal với cd, nhưng nó không hoạt động trên các bí danh : bash: cd: example-alias: Not a directory. Có thể thay đổi thư mục thành đích của bí danh trong Terminal không?


Tôi đã cập nhật câu trả lời của mình
markhunte

Câu trả lời:


5

Để bật cd'ing vào bí danh thư mục tôi đã tìm thấy sau đây tại Mac OS X Gợi ý .

Biên dịch mã nguồn dưới đây bằng lệnh sau:

gcc -o getTrueName -framework Carbon getTrueName.c

Điều này sẽ tạo ra tệp thực thi 'getTrueName' trong cùng thư mục với nguồn. Bạn có thể thêm nó vào PATH của mình hoặc chỉ cần sao chép trực tiếp vào / usr / bin hoặc / usr / local / bin để dễ dàng truy cập.

Mã nguồn C cho getTrueName (sao chép văn bản và lưu tệp dưới dạng getTrueName.c trong thư mục chính của bạn):

// 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 );
  }

Bao gồm các mục sau trong ~ / .bash_profile hoặc tạo tệp mới ~ / .bash_profile với nội dung sau:

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
}

Bạn có thể phải khởi động lại Terminal để tải .bash_profile đã sửa đổi của bạn.

Đã thử nghiệm trong Yosemite 10.10.2 & gcc 4.2 (Xcode 6.2) và nó hoạt động.

Một cách tiếp cận tương tự có sẵn tại superuser.com


3

Tôi đã không kiểm tra câu trả lời của @klanomath, nhưng trước đây đã từng có một thư viện Python để lấy mục tiêu của bí danh, nhưng hỗ trợ Carbon đã bị xóa khỏi các khung của Apple. Nó có thể được thực hiện trong Mục tiêu C xem https://stackoverflow.com/a/21151368/838253 .

Đặt cược tốt nhất là sử dụng các liên kết tượng trưng, ​​nhưng tiếc là Finder không cho phép bạn tạo các liên kết này.

Tôi đã viết một Dịch vụ OS X tạo ra các liên kết tượng trưng (được cả Finder và Terminal hỗ trợ). Điều này chạy tập lệnh bash sau trong quy trình tìm kiếm. (Thật không may, dường như không thể đăng mã Automator ở định dạng có thể đọc được).

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
Trong một câu bạn nói "Đặt cược tốt nhất là sử dụng các liên kết tượng trưng, ​​nhưng tiếc là Finder không hỗ trợ điều này." và sau đó nói "... tạo ra các liên kết tượng trưng (được cả Finder và Terminal hỗ trợ)" và chúng có vẻ mâu thuẫn với nhau, vì vậy hãy xem xét viết lại nó là "Finder không hỗ trợ điều này" là tham vọng. Ngoài ra curFolder, linkFilecác biến và không được sử dụng, vậy tại sao chúng ở đó? Cần có khoảng trống xung quanh toán tử so sánh, ví dụ $fileExists == ""và xem xét sử dụng $(..)thay vì backticks kế thừa.
dùng3439894

@ user3439894 thay đổi từ ngữ. Bạn đúng về mã. Tôi đã viết nó vào năm 2011, ngay sau khi tôi có máy Mac, và nó đã hoạt động kể từ đó và tôi đã không xem xét nó kể từ đó. Các biến không sử dụng có thể còn sót lại từ thử nghiệm.
Milliways

3

Đây là của tôi về điều này.

thêm và tải chức năng này vào .profile của bạn.

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";
}

Cập nhật.

Tôi đã sử dụng builtin cd dòng hiển thị trong câu trả lời @klanomath cho phép bạn ghi đè lệnh cd. Vì vậy, bây giờ chúng ta có thể sử dụng:

cd /path/to/example-alias

hoặc là

cd /path/to/example

Hàm sẽ trả về và cd vào đường dẫn gốc của bí danh gốc hoặc đường dẫn bình thường.


1

Mặc dù một liên kết tượng trưng (bí danh UNIX) trông giống như bí danh Finder trong Finder, chúng là hai loại bí danh hoàn chỉnh khác nhau.

Một liên kết tượng trưng sẽ chỉ giữ đường dẫn mà nó dẫn đến và sẽ phá vỡ vĩnh viễn hoặc tạm thời nếu tài nguyên được di chuyển hoặc trên một ổ đĩa bị ngắt kết nối hoặc chia sẻ tương ứng.

Bí danh Finder về mặt kỹ thuật là một tệp thông thường có hướng dẫn cho Finder. Finder có thể sử dụng thông tin này để định vị tệp / thư mục đích đã di chuyển đến một mức độ nhất định. Nếu tài nguyên đích của bí danh nằm trên điểm chia sẻ mạng được gắn kết, nó cũng chứa thông tin về mục Keychain nào sẽ sử dụng để đăng nhập bạn vào điểm chia sẻ để mở.

Vì vậy, trừ khi bạn viết một tập lệnh hoặc chương trình để đọc tệp bí danh Finder, nó sẽ không sử dụng nó làm thư mục mà là một tệp trong Terminal.

Ngoài ra, bạn có thể xóa bí danh Finder hiện tại và tạo một liên kết tượng trưng ở vị trí của nó. Lệnh sẽ là ln -s /path/to/originaltạo một liên kết tượng trưng tại thư mục hiện tại. Đường dẫn có thể là một đường dẫn đầy đủ hoặc tương đối.


1
  1. @ applhunte's applescript hoạt động, nhưng có một thông báo cảnh báo: osascript[9807:7154723] CFURLGetFSRef was passed an URL which has no scheme (the URL will not work with other CFURL routines)

Nhờ sự giúp đỡ của mẹo này , tôi đã sửa đổi applescript của @ markunte để xóa thông báo cảnh báo ở trên

  1. applescript của @ markhunte hơi chậm vì nó luôn gọi applescript. Vì vậy, theo mẹo của @ klanomath được liệt kê ở trên, tôi đã sửa đổi tập lệnh để chỉ gọi applescript khi đối tượng đích là bí danh.
# 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

Giống như hầu hết mọi hệ điều hành (ngoài Windows), OS X hỗ trợ các tập lệnh Bash. Trước tiên hãy tạo tệp trên Bàn làm việc của bạn (hoặc bất kỳ vị trí nào bạn muốn):

chạm ~ / Desktop / PlexConnect.sh Tiếp theo, đặt quyền của tệp sao cho có thể thực thi được:

chmod + x ~ / Desktop / PlexConnect.sh Sau đó, bạn có thể chỉnh sửa nội dung của tập lệnh bằng trình soạn thảo văn bản mà bạn chọn, chỉ cần đảm bảo rằng nó bắt đầu bằng dòng sau để hệ thống biết chạy nó bằng shell (Bash):

! / thùng / bash

Tập tin sau đó có thể được nhấp đúp, khởi chạy Terminal và thực thi nó.

Tuy nhiên, một giải pháp tinh tế hơn cho việc này có thể là tạo một ứng dụng AppleScript chạy lệnh cho bạn. Mở ứng dụng "Script Editor" và dán vào phần sau:

thực hiện tập lệnh shell "/Appluggest/PlexConnect-master/PlexConnect.py" với đặc quyền của quản trị viên Lưu cái này dưới dạng "Ứng dụng", đặt tên nó theo bất cứ điều gì bạn muốn. Khi mở nó, nó sẽ cung cấp cho bạn lời nhắc mật khẩu tiêu chuẩn của OS X, thực thi tập lệnh, sau đó tự đóng lại.


Làm thế nào để trả lời câu hỏi trên đầu trang? Trong khi làm rõ, bạn có thể vui lòng sửa định dạng của bài viết của bạn?
nohillside

Điều này có liên quan gì với các bí danh như đã hỏi trong câu hỏi Ngoài ra, vui lòng định dạng câu trả lời của bạn như được mô tả trong Trung tâm trợ giúp apple.stackexchange.com/help/formatted
user151019
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.