如何从终端转到别名?


9

别名是指在Finder中右键单击文件夹并选择“制作别名”时创建的文件夹快捷方式。我可以使用来遍历Terminal中的符号链接cd,但不适用于别名:bash: cd: example-alias: Not a directory。是否可以在终端中将目录更改为别名的目的地?


我更新了答案
markhunte 2015年

Answers:


5

为了使CD'ing进入文件夹别名,我在Mac OS X提示中找到了以下内容。

使用以下命令编译以下源代码:

gcc -o getTrueName -framework Carbon getTrueName.c

这将在与源文件相同的目录中创建“ getTrueName”可执行文件。您可以将其添加到PATH中,或者直接将其直接复制到/ usr / bin或/ usr / local / bin中,以便于访问。

getTrueName的C源代码(复制文本并将文件另存为您的主目录中的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

最好的选择是使用符号链接,但是不幸的是Finder不允许您创建符号链接。

我已经编写了OS X服务,该服务创建了符号链接(Finder和Terminal都支持)。这将在Finder工作流程中运行以下bash脚本。(不幸的是,似乎不可能以可读格式发布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
用一句话说:“最好的选择是使用符号链接,但是不幸的是Finder不支持此功能。” 然后说“ ...创建了符号链接(Finder和Terminal均支持)”,并且这些符号链接似乎相互矛盾,因此请考虑改写它的措辞,因为“ Finder不支持此功能”是雄心勃勃的。而且curFolderlinkFile变量都未使用,为什么它们在那里?比较运算符周围应该有空格,例如$fileExists == "",考虑使用$(..)而不是旧的反引号。
user3439894 2015年

@ 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到别名original或常规路径的原始路径。


1

虽然符号链接(UNIX别名)与Finder内部的Finder别名相同,但它们是两种完全不同的别名。

如果资源被移动或分别位于断开的驱动器或共享上,则符号链接将仅保留其通往的路径,并且将永久或暂时断开。

从技术上讲,Finder别名是一个普通文件,其中包含有关Finder的说明。Finder可以使用此信息在一定程度上定位移动的目标文件/目录。如果别名的目标资源在已安装的网络共享点上,则它还将保存有关使用哪个“钥匙串”项将您登录到共享点以打开它的信息。

因此,除非编写脚本或程序以读取Finder别名文件,否则它将不会将其用作目录,而是用作Terminal中的文件。

或者,您可以删除当前的Finder别名并在其位置创建符号链接。命令将是ln -s /path/to/original在当前目录中创建一个符号链接。该路径可以是完整或相对路径。


1
  1. @markhunte的applescript起作用了,但是有一条警告消息: osascript[9807:7154723] CFURLGetFSRef was passed an URL which has no scheme (the URL will not work with other CFURL routines)

借助本技巧,我修改了@markunte的applescript以删除上述警告消息

  1. @markhunte的applescript有点慢,因为它总是调用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 / bash

然后可以双击该文件,启动Terminal并执行它。

但是,一个更优雅的解决方案可能是创建一个AppleScript应用程序来为您运行命令。打开“脚本编辑器”应用程序,然后粘贴以下内容:

使用管理员权限执行shell脚本“ /Applications/PlexConnect-master/PlexConnect.py”将其保存为“应用程序”,并根据需要命名。打开它时,它将为您提供OS X的标准密码提示,执行脚本,然后自行关闭。


这如何回答最上面提出的问题?在澄清的同时,您还可以修正帖子的格式吗?
nohillside

这与问题中所问的别名有什么关系?也请按照帮助中心中所述的格式格式化您的答案apple.stackexchange.com/help/formatting
user151019,9
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.