62 votes

Création de liens physiques dans MacOS X?

Comment créer un lien physique vers un répertoire sous OSX?

Cette fonctionnalité a été ajoutée à leur système de fichiers dans la version 10.5 (pour Time Machine), mais je n’ai trouvé aucune information sur son utilisation à partir de la ligne de commande.

85voto

Sam Points 296

J'ai regroupé la réponse suggérée dans un représentant git si quelqu'un est intéressé

https://github.com/selkhateeb/hardlink

J'ai aussi remarqué que la commande de dissociation ne fonctionnait pas sur le léopard des neiges .. alors j'ai ajouté une option permettant de dissocier

si simple une fois installé, il peut être utilisé comme suit:

lier:

 hardlink source destination
 

dissocier:

 hardlink -u destination
 

73voto

Freeman Points 1725

Malheureusement, Apple a paralysé la commande ln . Vous pouvez utiliser le programme suivant pour créer un lien physique vers un répertoire:

 #include <unistd.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
 if (argc != 3) {
  fprintf(stderr,"Use: hlink <src_dir> <target_dir>\n");
  return 1;
 }
 int ret = link(argv[1],argv[2]);
 if (ret != 0)
  perror("link");
 return ret;
}
 

Tenez compte du fait que les répertoires liés durement peuvent ne pas se trouver dans le même répertoire parent, vous pouvez donc procéder comme suit:

 $ gcc hlink.c -o hlink
$ mkdir child1
$ mkdir parent
$ ./hlink child1 parent/clone2
 

17voto

rleber Points 180

En réponse à la question posée par the_undefined sur la façon de supprimer un hardlink à un répertoire sans supprimer le contenu d'autres répertoires qui lui sont liés: d'Aussi loin que je peux dire, il ne peut pas être fait à partir de la ligne de commande à l'aide de builtin commands. Cependant, ce petit programme (inspiré par Freeman post) de le faire:

#include <unistd.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
 if (argc != 2) {
  fprintf(stderr,"Use: hunlink <dir>\n");
  return 1;
 }
 int ret = unlink(argv[1]);
 if (ret != 0)
  perror("unlink");
 return ret;
}

À suivre avec Freeman exemple,

$ gcc hunlink.c -o hunlink
$ echo "foo bar" > child1/baz.txt
$ ./hunlink parent/clone2

Va supprimer le hardlink au parent/clone2, mais laissez le répertoire enfant1 et le fichier child1/baz.txt seul.

12voto

Kit Sunde Points 4026

Une autre solution consiste à utiliser bindfs https://code.google.com/p/bindfs/ qui peut être installé via le port:

 sudo port install bindfs
sudo bindfs ~/source_dir ~/target_dir
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X