links simbólicos
Referências autodereferenciadas a nomes de arquivos
Um link simbólico é literalmente um arquivo de texto tratado especialmente pelo kernel e cujo conteúdo é um caminho para outro arquivo / diretório.
Você pode ler o conteúdo de um arquivo de link simbólico com readlink
e, se abrir um arquivo de link simbólico, o sistema abrirá o arquivo / diretório referenciado pelo conteúdo do link simbólico.
Analogia de referência de ponteiro / C ++
Se você estiver familiarizado com C / C ++, um link simbólico se comportará como uma referência C ++ ou um ponteiro autodereferenciado na maioria dos contextos (não todos: por exemplo, rm
ou mv
funcionar diretamente no symlink, não em o alvo). A diferença é que referências reais em C ++ são vinculadas a endereços de memória, enquanto links simbólicos se ligam a endereços de sistemas de arquivos.
Links simbólicos pendentes
O conteúdo de um link simbólico não precisa ser uma referência de caminho de campo válida - > então você tem um link simbólico pendente (como ponteiro danglig ou uma referência pendente).
links simbólicos relativos
Se o caminho de arquivo em um link simbólico não é absoluto (começando com /
), então o caminho de arquivo relativo é resolvido relativamente ao local do symlink (em contextos não-symlink, caminhos relativos são resolvidos em relação ao $PWD
).
O sinalizador -s e os links de hardware
O -s
flag é para "criar s ymlinks". ln
também pode criar hardlinks .
Os hardlinks operam em outro nível, que é mais próximo da implementação do sistema de arquivos (consequentemente, você não pode criar hardlinks em diferentes sistemas de arquivos).
Sistemas de arquivos Unix armazenam nomes de arquivos (/ nomes de diretórios) e conteúdo de arquivos (conteúdo do diretório) separadamente, e os nomes são apenas ponteiros contados de referência autodereferenciados para seus conteúdos. Um hardlink cria outro nome para o mesmo conteúdo enquanto aumenta a contagem de referência.
$ echo 'the contents' > f1
$ ls -l f1
* 1 * #the 2nd column is the reference count
$ ln f1 f2 #create another name for the contents of f1
$ ls -l f1
* 2 * #the contents of f1 has two named references to it
$ rm f1 #the contents of f1 lives on (in f2) #
# because rm only removes the reference to the data block
#and this isn't the only reference
#(rm ivokes a system call literally named 'unlink')
Hardlinks de diretório
Você não pode criar hardlinks de diretório, mas .
e ..
são hardlinks de diretório criados implicitamente para você. Consequentemente, a contagem do hardlink para um diretório reflete quantos subdiretórios ele possui (cada subdiretório vem com um% hard_de% hardlink para o pai).
Links simbólicos e links de hardware - Visão geral de fotos grandes:
echo 'file data' > fileName
ln fileName fileName2 #hardlink
ln -s "$PWD/fileName" absoluteSymlinkTofileName
ln -s fileName relativeSymlinkTofileName
No mesmo sistema de arquivos físico, ..
cria outro nome para ln
( file data
falhará nos sistemas de arquivos). Você pode excluir ln
ou fileName
e, enquanto pelo menos um nome permanecer, fileName2
continuará ativo.
file data
é uma referência autodereferenciada ao nome absoluteSymlikTofileName
. Contanto que esse caminho seja resolvido para algo, o link simbólico é válido. Se você excluir o alvo, o link simbólico ficará suspenso. Este é um symlink absoluto para que você possa movê-lo para outros lugares sem alterar sua validade.
fileName
refere-se a um nome chamado relativeSymlinkToFileName
no mesmo diretório que o diretório fileName
. Se você movê-lo para outro diretório que também tenha um arquivo (ou diretório) chamado relativeSymlinkToFileName
, então ele apontará para isso.