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.
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
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
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.
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