Por alias, me refiero al acceso directo de carpeta creado cuando usted haga clic derecho en una carpeta en el Finder y seleccione "Hacer Alias". Yo puedo recorrer enlaces simbólicos en Terminal con cd
, pero no funciona en alias: bash: cd: example-alias: Not a directory
. ¿Es posible cambiar el directorio de destino de un alias en el Terminal?
Respuestas
¿Demasiados anuncios?Para habilitar el cd de ing en una carpeta alias he encontrado lo siguiente en Mac OS X Hints.
Compilar el código fuente a continuación con el siguiente comando:
gcc -o getTrueName -framework Carbon getTrueName.c
Esto creará el 'getTrueName ejecutable en el mismo directorio que el de origen. Usted puede añadir a su CAMINO, o simplemente copiar directamente a /usr/bin o /usr/local/bin, por lo que es de fácil acceso.
Código fuente C para getTrueName (copiar el texto y guardar el archivo como getTrueName.c en su directorio de inicio):
// 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 );
}
Incluya lo siguiente en ~/.bash_profile o crear un nuevo archivo ~/.bash_profile con el siguiente contenido:
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
}
Es probable que tenga que reiniciar el Terminal para cargar su modificación .bash_profile.
Probado en Yosemite 10.10.2 & gcc 4.2 (Xcode 6.2) y funciona.
Un enfoque similar está disponible en superuser.com
Aquí está mi opinión sobre esto.
Agregar y cargar esta función en su .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";
}
Actualización.
He utilizado el builtin cd
línea se muestra en la respuesta de @klanomath que le permite reemplazar el comando cd. Así que ahora podemos usar:
cd /path/to/example-alias
o
cd /path/to/example
La función debe devolver y cd a la ruta original de los alias originales o la ruta normal.
Yo no he probado la respuesta por @klanomath, pero no solía ser una biblioteca de Python para conseguir el objetivo de un alias, pero el Carbono, el apoyo fue retirado de la Manzana marcos. Se puede hacer en Objective C ver http://stackoverflow.com/a/21151368/838253.
La mejor apuesta es el uso de enlaces simbólicos, pero por desgracia Buscador no permite crear estos.
He escrito un OS X Servicio que crea enlaces simbólicos (que son apoyados por el Buscador y Terminal). Esto ejecuta el siguiente script de bash en un Buscador de flujo de trabajo. (Por desgracia, no parece ser posible para el post de Automator código en un formato legible).
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
Mientras que un enlace simbólico (UNIX alias) tiene el mismo aspecto como un Buscador de alias dentro del Buscador, son dos tipos diferentes de alias.
Un enlace simbólico contendrá sólo el camino que conduce y de forma permanente o temporal romperse si el recurso se mueve o en una unidad desconectada o compartir respectivamente.
Un Buscador de alias es técnicamente un archivo ordinario con las instrucciones para el Buscador. El Buscador puede utilizar esta información para encontrar una movida de destino del archivo/directorio, en cierta medida. Si un recurso de destino de un alias es montado en un recurso compartido de red, también tiene información de que el Llavero elemento a utilizar para iniciar la sesión en el punto de recurso compartido para abrirlo.
Así que, a menos que escribir un script o programa para leer el Buscador de alias del archivo, ya que no lo uso como un directorio, pero como un archivo en la Terminal.
Alternativamente, usted puede eliminar el actual Buscador de alias y crear un enlace simbólico en su lugar. Comando sería ln -s /path/to/original
a crear un enlace simbólico en el directorio actual. La ruta puede ser una ruta completa o relativa.