Création de liens physiques dans les répertoires sous Mac OS X [dupliquer]
Question
Cette question a déjà une réponse ici:
- commande pour créer un lien dur vers un répertoire sous OS X? 14 réponses
Comment créer un lien physique vers un répertoire sous Mac OS X?
Cette fonctionnalité a été ajoutée à leur système de fichiers dans Mac & nbsp; OS & nbsp; X & nbsp; v10.5 (Leopard) (pour la machine à voyager dans le temps), mais je n'ai trouvé aucune information sur son utilisation réelle à partir de la ligne de commande.
La solution
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. Pour ce faire, procédez comme suit:
$ gcc hlink.c -o hlink
$ mkdir child1
$ mkdir parent
$ ./hlink child1 parent/clone2
Autres conseils
J'ai regroupé la réponse suggérée dans un référentiel Git si cela vous intéresse: 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 fonctionnait pas sous Mac OS X v10.6 (Snow Leopard). J'ai donc ajouté une option permettant de dissocier:
hln -u destination
Pour installer Hardlink, utilisez Homebrew et exécutez la commande suivante:
brew install hardlink-osx
Dans la réponse à la question de the_undefined sur la façon de supprimer un lien physique dans 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 en utilisant des commandes intégrées. Cependant, ce petit programme (inspiré par le 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 suivre l'exemple de Freeman,
$ gcc hunlink.c -o hunlink
$ echo "foo bar" > child1/baz.txt
$ ./hunlink parent/clone2
supprimera le lien dur dans parent / clone2, mais laissera le répertoire child1
et le fichier child1 / baz.txt
seul.
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