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 paraa
chamadob
. 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 c
Note 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 arquivosa
eb
no diretórioc
. Aqui é onde a conversão está acontecendo, as opções passadas paracp
são:-a, --archive same as -dR --preserve=all -d same as --no-dereference --preserve=links -H follow command-line symbolic links in SOURCE
O
-H
é necessário porque (deinfo cp
):When copying from a symbolic link, 'cp' normally follows the link only when not copying recursively.
Como
-a
ativa a cópia recursiva (-R
),-H
é necessário para seguir os links simbólicos.-H
significa 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.