web-dev-qa-db-fra.com

Création de liens matériels de répertoire sous Mac OS X

Comment puis-je créer un lien dur vers un répertoire sous Mac OS X?

Cette fonctionnalité a été ajoutée à leur système de fichiers dans Mac OS X v10.5 (Leopard) (pour Time Machine), mais je n'ai trouvé aucune information sur son utilisation réelle depuis la ligne de commande.

55
Felix Geisendörfer

Malheureusement Apple a paralysé la commande ln. Vous pouvez utiliser le programme suivant pour créer un lien dur 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 en dur peuvent ne pas être dans le même répertoire parent, vous pouvez donc faire ceci:

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

J'ai regroupé la réponse suggérée dans un référentiel Git si quelqu'un est intéressé: https://github.com/selkhateeb/hardlink

Une fois installé, créez un lien dur avec:

hln source destination

J'ai également remarqué que la commande unlink ne fonctionne pas sur Mac OS X v10.6 (Snow Leopard), j'ai donc ajouté une option pour dissocier:

hln -u destination

Pour installer Hardlink, utilisez Homebrew et exécutez:

brew install hardlink-osx
82
Sam

Dans la réponse à la question de the_undefined sur la façon de supprimer un lien dur vers un répertoire sans supprimer le contenu des autres répertoires auxquels il est lié: Pour autant que je sache, cela ne peut pas être fait à partir de la ligne de commande à l'aide de commandes intégrées . Cependant, ce petit programme (inspiré du post de Freeman) le fera:

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

Pour poursuivre avec l'exemple de Freeman,

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

supprimera le lien physique à parent/clone2, mais laissez le répertoire child1 et le fichier child1/baz.txt seul.

17
rleber

Une autre solution consiste à utiliser bindfs https://code.google.com/p/bindfs/ qui est installable via le port:

Sudo port install bindfs
Sudo bindfs ~/source_dir ~/target_dir
7
Kit Sunde