O exemplo na página de informações mostra como o exemplo é um pouco difícil de seguir:
$ mkdir c; : > a; ln -s a b; cp -aH a b c; ls -i1 c
74161745 a
74161745 b
Vamos dividir isso em seus comandos componentes:
-
mkdir c;: cria o diretórioc/ -
: > a;: apenas uma maneira rápida de criar um arquivo vazio. É equivalente aecho "" > a.:é um bash construído em que não faz nada, vejahelp :. -
ln -s a b: crie um link paraachamadob. Neste ponto, estes são os conteúdos do diretório atual:$ ls -l | cc2ter total 4 -rw-r--r-- 1 terdon terdon 0 Oct 9 02:50 a lrwxrwxrwx 1 terdon terdon 1 Oct 9 02:50 b -> a drwxr-xr-x 2 terdon terdon 4096 Oct 9 02:50 cNote que
bé um link simbólico (link suave) não aponta para o mesmo inode quea:$ ls -i1c a b 16647344 a 16647362 b -
cp -aH a b c;: copie os arquivosaebno diretórioc. Aqui é onde a conversão está acontecendo, as opções passadas paracpsão:-a, --archive same as -dR --preserve=all -d same as --no-dereference --preserve=links -H follow command-line symbolic links in SOURCEO
-Hé necessário porque (deinfo cp):When copying from a symbolic link, 'cp' normally follows the link only when not copying recursively.
Como
-aativa a cópia recursiva (-R),-Hé necessário para seguir os links simbólicos.-Hsignifica que os links são seguidos apesar da recursão e resultarão na criação de links físicos no diretório de destino. Estes são os conteúdos dec/após o último passo (a primeira coluna é o número do inode):$ ls -li c total 0 17044704 -rw-r--r-- 2 terdon terdon 0 Oct 9 02:50 a 17044704 -rw-r--r-- 2 terdon terdon 0 Oct 9 02:50 b
Agora, exatamente como isso funciona, até onde eu consigo descobrir, cp --preserve=links combinado com -L ou -H converterá links simbólicos em links físicos se o link e o alvo está sendo copiado para o mesmo diretório .
Na verdade, como o OP descobriu , pelo menos nos sistemas Debian, cp --preserve=links is suficiente para converter links simbólicos em links físicos se o diretório de destino for o mesmo.