Domanda

    

Questa domanda ha già una risposta qui:

         

Come posso creare un collegamento reale a una directory in Mac & nbsp; OS & nbsp; X?

Questa funzione è stata aggiunta al loro file system in Mac & nbsp; OS & nbsp; X & nbsp; v10.5 (Leopard) (per macchina del tempo), ma non sono riuscito a trovare alcuna informazione su come usarlo effettivamente dalla riga di comando.

È stato utile?

Soluzione

Purtroppo Apple ha paralizzato il comando ln . È possibile utilizzare il seguente programma per creare un collegamento reale a una directory:

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

Tieni presente che le directory hard link potrebbero non essere nella stessa directory padre, quindi puoi farlo:

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

Altri suggerimenti

Ho raggruppato la risposta suggerita in un repository Git se qualcuno è interessato: https://github.com / selkhateeb / hardlink

Una volta installato, crea un collegamento reale con:

hln source destination

Ho anche notato che il comando unlink non funziona su Mac & nbsp; OS & nbsp; X & nbsp; v10.6 (Snow & nbsp; Leopard), quindi ho aggiunto un'opzione per scollegare:

hln -u destination

Per installare Hardlink, usa Homebrew ed esegui:

brew install hardlink-osx

Nella risposta alla domanda di the_undefined su come rimuovere un hardlink in una directory senza rimuovere il contenuto di altre directory a cui è collegato: per quanto posso dire, non può essere fatto dalla riga di comando usando i comandi integrati. Tuttavia, questo piccolo programma (ispirato al post di Freeman) lo farà:

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

Per continuare con l'esempio di Freeman,

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

rimuoverà il collegamento fisico su parent / clone2, ma lascerà solo la directory child1 e il file child1 / baz.txt .

Un'altra soluzione è quella di utilizzare bindfs https://code.google.com/p/bindfs/ che è installabile tramite porta:

sudo port install bindfs
sudo bindfs ~/source_dir ~/target_dir
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top