15 votes

Comment accéder à un alias à partir du terminal ?

Par alias, j'entends le raccourci de dossier créé lorsque vous cliquez avec le bouton droit de la souris sur un dossier dans le Finder et sélectionnez "Make Alias". Je peux traverser les liens symboliques dans le Terminal avec cd mais cela ne fonctionne pas sur les alias : bash: cd: example-alias: Not a directory . Est-il possible de changer le répertoire de destination d'un alias dans le Terminal ?

8voto

klanomath Points 63400

Pour permettre de cd'ing dans un alias de dossier, j'ai trouvé ce qui suit à l'adresse suivante Conseils pour Mac OS X .

Compilez le code source ci-dessous avec la commande suivante :

gcc -o getTrueName -framework Carbon getTrueName.c

Cela créera l'exécutable 'getTrueName' dans le même répertoire que la source. Vous pouvez l'ajouter à votre PATH, ou simplement le copier directement dans /usr/bin ou /usr/local/bin pour qu'il soit facile d'accès.

Code source C pour getTrueName (copiez le texte et enregistrez le fichier sous le nom de getTrueName.c dans votre répertoire personnel) :

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

Incluez ce qui suit dans ~/.bash_profile ou créez un nouveau fichier ~/.bash_profile avec le contenu suivant :

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
}

Vous devrez probablement redémarrer Terminal pour charger votre fichier .bash_profile modifié.

Testé dans Yosemite 10.10.2 & gcc 4.2 (Xcode 6.2) et cela fonctionne.

Une approche similaire est disponible à l'adresse suivante superuser.com

4voto

markhunte Points 11634

Voici ce que j'en pense.

ajouter et charger cette fonction dans votre .profil.

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

Mise à jour.

J'ai utilisé le builtin cd ligne indiquée dans la réponse de @klanomath qui vous permet de remplacer la commande cd. Nous pouvons donc maintenant utiliser :

cd /path/to/example-alias

o

cd /path/to/example

La fonction doit retourner et cd vers le chemin original des alias originaux ou le chemin normal.

3voto

evilcandybag Points 101

Je n'ai pas testé la réponse de @klanomath, mais il existait autrefois une bibliothèque Python pour obtenir la cible d'un alias, mais le support de Carbon a été supprimé des frameworks Apple. Cela peut être fait en Objective C voir https://stackoverflow.com/a/21151368/838253 .

Le mieux est d'utiliser des liens symboliques, mais malheureusement le Finder ne permet pas de les créer.

J'ai écrit un service OS X qui crée des liens symboliques (qui sont pris en charge à la fois par le Finder et le Terminal). Cela exécute le bash script suivant dans un flux de travail Finder. (Malheureusement, il ne semble pas être possible de poster du code Automator dans un format lisible).

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

1voto

Phoenix Points 1415

Bien qu'un lien symbolique (alias UNIX) ait la même apparence qu'un alias Finder dans Finder, il s'agit de deux types d'alias complètement différents.

Un lien symbolique ne conservera que le chemin auquel il mène et sera définitivement ou temporairement rompu si la ressource est déplacée ou se trouve sur un lecteur ou un partage déconnecté respectivement.

Un alias Finder est techniquement un fichier ordinaire avec des instructions pour le Finder. Le Finder peut, dans une certaine mesure, utiliser ces informations pour localiser un fichier/répertoire cible déplacé. Si la ressource cible d'un alias se trouve sur un point de partage réseau monté, elle contient également des informations sur l'élément du trousseau à utiliser pour vous connecter au point de partage afin de l'ouvrir.

Ainsi, à moins que vous n'écriviez un script ou un programme pour lire le fichier alias du Finder, il ne l'utilisera pas comme un répertoire, mais comme un fichier dans le Terminal.

Vous pouvez également supprimer l'alias actuel du Finder et créer un lien symbolique à sa place. La commande serait ln -s /path/to/original pour créer un lien symbolique dans le répertoire courant. Le chemin peut être un chemin complet ou relatif.

1voto

z0nam Points 334
  1. L'applescript de @markhunte a fonctionné, mais il y avait un message d'avertissement : osascript[9807:7154723] CFURLGetFSRef was passed an URL which has no scheme (the URL will not work with other CFURL routines)

Avec l'aide de ce conseil J'ai modifié l'applescript de @markunte pour supprimer le message d'avertissement ci-dessus.

  1. L'applescript de @markhunte est légèrement lent car il invoque toujours l'applescript. Donc en suivant le conseil de @klanomath qui est listé ci-dessus, j'ai modifié le script pour invoquer l'applescript uniquement lorsque l'objet cible est un alias.

    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 }

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X