Questão Ligação simbólica no Terminal (O que estou fazendo errado?)


Eu quero criar links simbólicos para todos os arquivos em uma pasta parent/target/. Eu quero que os links estejam na pasta parent/destination/. Meu diretório de trabalho é parent/ para a seguinte saída de terminal usando bash:

$ cd target/
$ ll
total 16
drwxr-xr-x 4 jesse staff 136 Feb 23 16:31 ./
drwxr-xr-x@ 10 jesse staff 340 Feb 23 16:38 ../
-rw-r--r-- 1 jesse staff 10 Feb 23 16:23 file.txt
-rw-r--r-- 1 jesse staff 10 Feb 23 16:23 file2.txt
$ ln -s * ../destination/
$ ll ../destination/
total 16
drwxr-xr-x 4 jesse staff 136 Feb 23 16:38 ./
drwxr-xr-x@ 10 jesse staff 340 Feb 23 16:38 ../
lrwxr-xr-x 1 jesse staff 8 Feb 23 16:38 file.txt@ -> file.txt
lrwxr-xr-x 1 jesse staff 9 Feb 23 16:38 file2.txt@ -> file2.txt

Por que é criar links simbólicos que se ligam a si mesmos? Eu li o ln página do homem e vários outros lnquestões de SE relacionadas, mas acho que estou perdendo alguma coisa.

(Eu estou usando bash no Terminal no OS X 10.11.3)


0


origem


Você precisa especificar um caminho absoluto na origem, como ln -s /home/jesse/target/* ../destination/. - AFH
@AFH Obrigado. Isso funcionou perfeitamente. Porque ln requer um caminho absoluto para o alvo? Existem outros programas bash que exigem caminhos absolutos? Isso não é algo que eu já vi antes. Além disso, por favor, adicione isso como uma resposta para que eu possa marcá-lo como correto. - jsejcksn


Respostas:


Você precisa especificar um caminho absoluto na fonte: no seu caso, seria:

ln -s $PWD/* ../destination/

Ao contrário de um link físico, em que a entrada de diretório criada faz referência direta ao mesmo arquivo de origem, um link simbólico contém o texto da referência do arquivo original. Na verdade, o arquivo de origem não precisa existir quando um link simbólico é criado, embora obviamente o uso de * garante que apenas os arquivos de origem existentes sejam usados.

Na verdade, é um pouco mais complicado do que isso: se você especificar um caminho absoluto no link, referenciar o link funcionará como se você tivesse especificado o arquivo original; mas se você especificar um caminho relativo, ele será adicionado ao diretório onde o link reside. Então, uma alternativa que você poderia usar a partir do target diretório é:

cd ../destination/; ln -s ../target/* .

Isso teria o mesmo efeito de um caminho absoluto, mas teria uma distinção: se toda a árvore de diretórios fosse copiada ou movida para outro local (por exemplo, em algum diretório de um usuário diferente), os links referenciariam os arquivos em seu novo local. A escolha de links absolutos ou relativos dependerá, portanto, se você deseja copiar ou mover os arquivos de origem junto com os links: se os arquivos de origem permanecerem sempre no mesmo local, use links absolutos.


1



Isso definitivamente respondeu à minha pergunta e me ensinou algumas coisas. Obrigado por isso. Eu tenho uma pergunta sobre o último bit ... Eu testei o que você sugeriu sobre o uso de um caminho relativo para ver se os links seguiriam os arquivos movidos, mas eles não o fizeram. Minha estrutura parece /a/1.txt /a/2.txt /aa/ /b/ e eu corri cd b/; ln -s ../a/* ./ que produziu os links, mas quando eu movi os dois arquivos de texto para pasta aa, os links não funcionavam mais. - jsejcksn
Eu não acho que você entendeu muito bem o que eu disse sobre links relativos: você precisa mover os arquivos originais e os links como parte da mesma estrutura de subdiretórios; você não pode mover um e não o outro. Então, se seus arquivos são dir1/a/*.txt e os links são dir1/b/*.txt, então você pode mover / copiar todo dir1/ estrutura para dir2/ e os links continuarão funcionando, enquanto links absolutos ainda referenciariam dir1/; se você mover os arquivos independentemente dos links, você precisará refazer os links - no seu caso, ../aa/*. - AFH
Ok, isso esclarece para mim. Obrigado por todas as informações. - jsejcksn