Answers:
为了使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上可以找到类似的方法
我还没有测试@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
curFolder
和linkFile
变量都未使用,为什么它们在那里?比较运算符周围应该有空格,例如$fileExists == ""
,考虑使用$(..)
而不是旧的反引号。
这是我的看法。
添加此功能并将其加载到您的.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或常规路径的原始路径。
虽然符号链接(UNIX别名)与Finder内部的Finder别名相同,但它们是两种完全不同的别名。
如果资源被移动或分别位于断开的驱动器或共享上,则符号链接将仅保留其通往的路径,并且将永久或暂时断开。
从技术上讲,Finder别名是一个普通文件,其中包含有关Finder的说明。Finder可以使用此信息在一定程度上定位移动的目标文件/目录。如果别名的目标资源在已安装的网络共享点上,则它还将保存有关使用哪个“钥匙串”项将您登录到共享点以打开它的信息。
因此,除非编写脚本或程序以读取Finder别名文件,否则它将不会将其用作目录,而是用作Terminal中的文件。
或者,您可以删除当前的Finder别名并在其位置创建符号链接。命令将是ln -s /path/to/original
在当前目录中创建一个符号链接。该路径可以是完整或相对路径。
osascript[9807:7154723] CFURLGetFSRef was passed an URL which has no scheme (the URL will not work with other CFURL routines)
借助本技巧,我修改了@markunte的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
}
像大多数任何操作系统(Windows除外)一样,OS X支持Bash脚本。首先在您的桌面(或您想要的任何位置)上创建文件:
触摸〜/ Desktop / PlexConnect.sh接下来,设置文件的权限,使其可执行。
chmod + x〜/ Desktop / PlexConnect.sh然后,您可以使用所选的文本编辑器编辑脚本的内容,只需确保脚本以以下行开头,以便系统知道使用外壳程序(Bash)运行它:
然后可以双击该文件,启动Terminal并执行它。
但是,一个更优雅的解决方案可能是创建一个AppleScript应用程序来为您运行命令。打开“脚本编辑器”应用程序,然后粘贴以下内容:
使用管理员权限执行shell脚本“ /Applications/PlexConnect-master/PlexConnect.py”将其保存为“应用程序”,并根据需要命名。打开它时,它将为您提供OS X的标准密码提示,执行脚本,然后自行关闭。