Création de liens physiques dans les répertoires sous Mac OS X [dupliquer]

StackOverflow https://stackoverflow.com/questions/1432540

  •  07-07-2019
  •  | 
  •  

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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top