it-swarm-pt.tech

Qual é o comando Unix para criar um hardlink para um diretório no OS X?

Como você cria um link físico (em oposição a um link simbólico ou um alias do Mac OS) no OS X que aponta para um diretório? Eu já conheço o comando "no destino de destino", mas isso só funciona quando o destino é um arquivo. Sei que o Mac OS, diferentemente de outros ambientes Unix, permite vincular pastas (isso é usado para o Time Machine, por exemplo), mas não sei como fazer isso sozinho.

48
username

Você não pode fazer isso diretamente no BASH então. No entanto ... Encontrei um artigo aqui que discute como fazê-lo indiretamente: http://www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html por compilando um pequeno programa C simples:

#include <unistd.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
   if (argc != 3) return 1;

   int ret = link(argv[1], argv[2]);

   if (ret != 0) perror("link");

   return ret;
}

... e construa no Terminal.app com:

$ gcc -o hlink hlink.c -Wall
31
username

Concordo que pastas/diretórios vinculados podem causar problemas se não forem cuidadosos, mas eles têm uma vantagem muito clara - o Time Machine é um exemplo perfeito. Sem eles, isso simplesmente não seria prático, pois a duplicação de versões redundantes de arquivos consumiria muito rapidamente até o maior dos discos.

O Snow Leopard pode criar links físicos para diretórios, desde que você siga as seis regras de Amit Singh:

  1. O sistema de arquivos deve ser registrado no diário HFS +.
  2. Os diretórios pai da origem e destino devem ser diferentes.
  3. O pai da fonte não deve ser o diretório raiz.
  4. O destino não deve estar no diretório raiz.
  5. O destino não deve ser um descendente da fonte.
  6. O destino não deve ter nenhum ancestral que seja um link físico do diretório.

Portanto, não está correto que o Snow Leopard tenha perdido a capacidade de criar links físicos para pastas.

Acabei de verificar que o link/unlink funciona no Snow Leopard - desde que você siga as seis regras. Eu apenas tentei e ele funciona bem no meu sistema Snow Leopard 10.6.6 - tentei no volume de inicialização e em um volume externo USB separado e funcionou bem nos dois casos.

Aqui está o programa "hunlink.c":

#include <stdio.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
   if (argc != 2)
      return 1;
   int ret = unlink(argv[1]);
   if (ret != 0)
      perror("unlink");
   return ret;
}

gcc -o hunlink hunlink.c

Portanto, tenha cuidado se você tentar - lembre-se de seguir as regras e use o hlink para criar esses links físicos e use o hunlink para remover o link físico posteriormente. E não se esqueça de documentar o que você fez mais tarde ou para outra pessoa que precise saber disso.

Um outro "pegadinha" que acabei de aprender sobre esses "links físicos" para pastas. Quando você os cria, realmente acontece muita coisa "por trás da cortina" do Mac OS X. Uma questão realmente importante é que a pasta para a qual você cria o link é realmente movida para uma pasta super oculta super mágica chamada /.HFS+ Dados do Diretório Privado% 000d/dir_xxx, em que xxx é o número do inode da "pasta_de_fonte" - lembre-se de que o formato do comando é

hlink source_folder target_folder

Portanto, por isso, você deve ter cuidado para não ter nenhum arquivo aberto na "pasta_de_fonte", porque, se o fizer, eles serão movidos para a pasta super-mágica e você provavelmente terá um problema se tentar salvar as alterações. àqueles arquivos que foram abertos na "pasta de origem". Isso aconteceu comigo algumas vezes até que me ocorreu o que estava acontecendo e a solução é bem simples. Notei que você não podia mais executar um comando "ls -la" sem obter erros engraçados para todas as pastas/diretórios que estavam na pasta original "source_folder", mas era possível executar um comando "ls" e tudo parecia bem.

Se você executar "Verificar disco" no programa "Utilitário de Disco", perceberá que ele provavelmente reclama e fornece um "Mapa de bits de volume que precisa de reparos menores para blocos órfãos", que foi o que aconteceu com a criação da pasta super-mágica e o movimento da "pasta de origem" para ele.

Se você se encontrar nessa situação com "blocos órfãos", primeiro salve os arquivos alterados em outro local temporário que não esteja no volume que contém a árvore "source_folder" e use o "Disk Utility" para desmontar e remontar o volume que contém o "source_folder" ou apenas reinicie o computador. Em seguida, copie os arquivos salvos nos locais temporários de volta aos seus locais originais e você deverá voltar aos negócios. Isso é o que funcionou para mim, então não posso garantir que isso funcione para você também. Portanto, pode ser uma boa ideia tentar fazer isso em um volume do qual você tenha um bom backup apenas por precaução.

Parece tão estranho que toda essa sobrecarga ocorra apenas pela simples tarefa de criar um link físico para uma pasta. Alguém tem alguma idéia de por que o Mac OS X faz todo esse esforço para criar esse link físico para pastas? Isso tem algo a ver com o fato de que este é um sistema de arquivos com registro em diário?

Eu descobri as informações sobre o local super-mágico e super-oculto lendo a explicação de Amit Singh sobre seu utilitário "hfsdebug". Se você quiser obter mais detalhes, consulte o site dele em tilitário hfsdebug de Amit Singh . É um software muito interessante e fornece muitos detalhes sobre os sistemas de arquivos HFS +. É grátis e eu encorajo você a fazer o download e experimentar. Ele não é mais suportado, mas ainda funciona no Snow Leopard e no Leopard - basicamente qualquer sistema suportado pelo HFS +. Você realmente não pode causar nenhum dano, pois é uma ferramenta "somente leitura" - portanto, é ótimo usar para examinar alguns detalhes do sistema de arquivos.

Mais uma questão sobre esses "links físicos para pastas" - depois que você cria uma e a pasta super-secreta e super-mágica oculta é criada, ela está lá para sempre. Mesmo se você desvincular a pasta que a criou, em primeiro lugar, essa pasta mágica permanecerá por perto. Não sei por que, mas definitivamente faz. Você pode usar o "hfsdebug" para descobrir se deseja experimentar. Você também pode usar o "hfsdebug" para descobrir quantos desses "links físicos para pastas" existem em uma unidade. Para esses detalhes, consulte o artigo de Amit sobre o utilitário "hfsdebug".

Ele também tem outro utilitário mais recente suportado, mas que custa. Chama-se fileXray e custa US $ 79 para uma pessoa em qualquer número de computadores na mesma residência para uma licença pessoal do tipo não comercial. Possui um extenso Guia do Usuário de 173 páginas que você pode baixar para ver o que ele pode fazer antes de comprar. Infelizmente, não há uma versão de teste, então leia o manual e confira o site para obter mais detalhes para ver se ele pode ajudá-lo a sair de um congestionamento. Aprenda todos os detalhes sobre o assunto em seu site - consulte site do fileXray para obter mais informações.

Há alguns problemas que você deve estar ciente ao usar esses links físicos para pastas. Se o volume em que eles são criados for montado em um cliente remoto, poderá haver problemas significativos, dependendo de como eles são montados. Se você usa o AFP para montar o volume em um cliente remoto, existem grandes problemas, pois qualquer pasta que atualmente possui um link físico ou já teve um, mas que foi removido posteriormente, não poderá ser usada como todas as pastas de nível inferior ( mas não arquivos) estarão inacessíveis na janela do Finder ou do Terminal. Se você tentar executar um comando "ls -lR" simples, ele falhará e exibirá mensagens de erro "ls: xxx: No file or directory" para todas as pastas de nível inferior. Se você usar uma janela do Finder para percorrer a árvore de diretórios do volume remoto, as pastas que estão na pasta que possui ou possui um link físico simplesmente desaparecerão sem nenhum erro quando você clicar pela primeira vez no nome da pasta.

Esses problemas não parecem ocorrer (exceto a mensagem de erro) se você usar o NFS para montar o cliente remoto (e supondo que você tenha um servidor NFS no sistema que tenha o volume como um sistema de arquivos HFS + local). Detalhes sobre como usar o NFS para montar volumes não são fornecidos aqui. Eu usei um programa agradável do Dr. Marcel Bresink chamado "NFS Manager" para ajudar nas montagens do NFS no servidor e no cliente. Você pode obtê-lo em seu site - basta procurar o "Bresink NFS Manager" em seu mecanismo de pesquisa favorito, mas ele possui uma versão de avaliação gratuita para que você possa experimentar antes de comprar. Não é tão importante se você quiser aprender a montar os NFS, mas o "NFS Manager" facilita bastante a configuração e o ajuste de todas as diferentes configurações para ajudar a otimizá-lo. Ele também possui vários outros utilitários interessantes do Mac OS X, com preços muito razoáveis ​​- um chamado "Monitor de Hardware" que permite monitorar e representar graficamente todos os tipos de coisas, como uso de energia, temperatura da CPU, velocidade dos ventiladores e muitas outras variáveis ​​para ambos. os sistemas Mac local e remoto por longos períodos de tempo (de minutos a dias). Definitivamente vale a pena conferir se você gosta de utilitários úteis.

Uma coisa que notei é que as transferências de arquivos NFS eram cerca de 20% mais lentas do que as efetuadas via AFP, mas sua "milhagem pode variar"; portanto, não há garantias de um jeito ou de outro, mas eu preferiria ter algo que funcione mesmo que eu tenha pagar 20% de desempenho em comparação a não ter nada funcionando.

A Apple está ciente dos problemas com links físicos e sistemas de arquivos AFP remotos, e eles se referem a ele como uma "limitação de implentação" do cliente AFP - prefiro chamá-lo do que realmente me parece ser - UM ERRO !!! Só espero que a próxima versão do Mac OS X resolva o problema, pois gosto muito de poder usar links físicos para pastas quando isso faz sentido.

Essas anotações são de minha opinião pessoal e eu não garanto a exatidão delas, portanto, use-as por seu próprio risco. Faça um bom backup antes de brincar com esses "links físicos para pastas", caso aconteça algo imprevisto. Mas espero que você se divirta se decidir se aprofundar um pouco mais neste aspecto interessante do Mac OS X.

49
Bob

Piffle. Na versão 10.5, ele mostra na página do manual ln:

   -d, -F, --directory
          allow the superuser to attempt to hard link  directories  (note:
          will  probably  fail  due  to  system restrictions, even for the
          superuser)

Então sim:

    Sudo  ln  -d  existing_dir  new_hard_link

Dê sua senha e você ainda não termino. Você não documentou, não é? Você deve documentar diretórios vinculados; mesmo que seja uma máquina de usuário único.

Excluir é uma história diferente: se você fizer a maneira usual de excluir diretórios, excluirá o conteúdo. Então você deve "desvincular" o diretório:

    unlink  new_hard_link

Lá. Espero que você não destrua seu sistema de arquivos!

14
Rich

Postagem cruzada essa ótima ferramenta que resolve o problema com nitidez, originalmente publicada por Sam :


Para instalar o Hardlink, verifique se você instalou homebrew e execute:

brew install hardlink-osx

Depois de instalado, crie um link físico com:

hln [source] [destination]

Também notei que o comando unlink não funciona no snow leopard, então adicionei uma opção para desvincular:

hln -u destination

O código está disponível no Github para aqueles que estão interessados: https://github.com/selkhateeb/hardlink

13
Simon East

Sim, é suportado pelo kernel e pelo sistema de arquivos, mas como não se destina ao uso geral, não é exposto ao Shell.

Você provavelmente poderia descobrir quais APIs o Time Machine usa e envolvê-las em uma ferramenta de linha de comando, mas seria melhor entender a dica e orientar bem.

9
Mike F

A versão OSX de ln não pode fazê-lo, mas, como mencionado na outra resposta por rich , é possível com a GNU versão de ln que está disponível em homebrew como gln como parte da fórmula coreutils . man gln lista os -d opção com o aviso específico do OSX fornecido na resposta de rich . Em outras palavras, ele não funciona em todos os casos. O que exatamente determina se funciona ou não parece não estar documentado em lugar algum.

Como pré-requisito, instale coreutils:

    brew install coreutils

Agora você pode fazer:

    Sudo gln -d /original_folder /mirror_folder

[~ # ~] importante [~ # ~] : Para remover o link físico, você deve use gunlink:

    Sudo gunlink /mirror_folder

Usar rm ou o Finder também excluirá a pasta original.

FYI: A fórmula homebrew coreutils fornece as versões compatíveis com GNU de ferramentas unix genéricas. Usar brew list coreutils para ver a lista completa.

6
ccpizza

A partir de 2018 não é mais possível. O APFS (introduzido no MacOS High Sierra 10.13) não é compatível com os hardlinks do diretório. Consulte https://github.com/selkhateeb/hardlink/issues/31

2
ariel

Meu caso foi o de descobrir que, em uma máquina virtual Windows, não consigo seguir links simbólicos. (eu queria testar algumas páginas HTML no Internet Explorer). E minha estrutura de diretórios tinha links simbólicos para pastas CSS e imagens.

Minha solução alternativa para resolver o problema foi uma abordagem diferente das outras respostas implícitas. Eu usei rsync para criar uma cópia da pasta. O Rsync pode resolver os links simbólicos e copiar os arquivos vinculados.

Isso resolveu meu problema sem usar links físicos para diretórios. E é realmente uma solução fácil se você estiver trabalhando apenas em um pequeno conjunto de arquivos.

rsync -av --copy-dirlinks --delete ../htmlguide ~/src/
2
Jesper Rønn-Jensen

A resposta curta é que você não pode. :) (exceto possivelmente como root, quando seria mais preciso dizer que não deveria).

Os unixes permitem apenas um número definido de links para diretórios - ".." de todos os seus filhos e "." de dentro de si. Qualquer outra coisa é potencialmente uma receita para uma árvore de diretórios muito confusa. Essa é/foi aparentemente uma decisão de design de Ken Thompson.

(Dito isto, aparentemente o Time Machine da Apple faz isso :))

1
Penfold

No Linux, você pode usar o bind mount para simular diretórios de link físico. Não tenho certeza sobre o OSX

Sudo mount --bind /some/existing_real_contents /else/dummy_but_existing_directory
Sudo umount /else/dummy_but_existing_directory
1
zainengineer

Isso também pode ser feito com o Perl interno (do Terminal) sem compilar nada. Meu caso de uso específico é para o Google Drive (que não oferece suporte a links simbólicos). Portanto, os exemplos abaixo refletem o caso de uso.

Para vincular sua pasta "Documentos" ao Google Drive para que seja sincronizada:

Perl -e 'link "/Users/me/Documents", "/Users/me/Google Drive/Documents"'

Para remover o link para a pasta "Documentos" do Google Drive:

Sudo Perl -U -e 'unlink "/Users/me/Google Drive/Documents"'

Você precisa "root" para desvincular (consulte perldoc "para desvincular").

1
techiejohn

No artigo vinculado a, você receberá esse erro se tentar criar o link físico no mesmo diretório que o original. Você precisa criá-lo em outro lugar.

1
Gannet

Outra solução é usar o bindfs https://code.google.com/p/bindfs/ , que é instalável via porta:

Sudo port install bindfs
Sudo bindfs ~/source_dir ~/target_dir
0
Kit Sunde

caso não exista uma subpasta, tente

no caminho da pasta /*.* pasta de destino

funcionou para mim no OSX 10.9

0
Nuray Altin