Creación de enlaces duros de directorio en Mac OS X [duplicado]
Pregunta
Esta pregunta ya tiene una respuesta aquí:
¿Cómo puedo crear un enlace duro a un directorio en Mac & nbsp; OS & nbsp; X?
Esta función se ha agregado a su sistema de archivos en Mac & nbsp; OS & nbsp; X & nbsp; v10.5 (Leopard) (para máquina del tiempo), pero no pude encontrar ninguna información sobre cómo usarlo desde la línea de comandos.
Solución
Desafortunadamente, Apple ha paralizado el comando ln
. Puede usar el siguiente programa para crear un enlace rígido a un directorio:
#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;
}
Tenga en cuenta que los directorios vinculados pueden no estar en el mismo directorio principal, por lo que puede hacer esto:
$ gcc hlink.c -o hlink
$ mkdir child1
$ mkdir parent
$ ./hlink child1 parent/clone2
Otros consejos
He incluido la respuesta sugerida en un repositorio de Git si alguien está interesado: https://github.com / selkhateeb / hardlink
Una vez instalado, cree un enlace duro con:
hln source destination
También noté que el comando unlink
no funciona en Mac & nbsp; OS & nbsp; X & nbsp; v10.6 (Snow & nbsp; Leopard), así que agregué una opción para desvincular:
hln -u destination
Para instalar Hardlink, use Homebrew y ejecute:
brew install hardlink-osx
En la respuesta a la pregunta de the_undefined acerca de cómo eliminar un enlace rígido a un directorio sin eliminar el contenido de otros directorios a los que está vinculado: Por lo que puedo decir, no se puede hacer desde la línea de comandos usando comandos incorporados. Sin embargo, este pequeño programa (inspirado en la publicación de Freeman) lo hará:
#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;
}
Para seguir con el ejemplo de Freeman,
$ gcc hunlink.c -o hunlink
$ echo "foo bar" > child1/baz.txt
$ ./hunlink parent/clone2
eliminará el enlace duro en parent / clone2, pero dejará solo el directorio child1
y el archivo child1 / baz.txt
.
Otra solución es usar bindfs https://code.google.com/p/bindfs/ que se puede instalar a través del puerto:
sudo port install bindfs
sudo bindfs ~/source_dir ~/target_dir