cp -H vs cp -L (O que é um link simbólico de "linha de comando"?)

5

Meu SO informa o seguinte na página man do cp:

   -H     follow command-line symbolic links

   -L, --dereference
          always follow symbolic links

Estou com dificuldade para descobrir o que é um "link simbólico da linha de comando ".

    
por barrrista 08.05.2013 / 20:54

2 respostas

11

Não existe um link simbólico de linha de comando. A página man se refere aos links que ocorrem na linha de comando, ou seja, como argumentos para o comando cp .

Sem a opção -R , o comportamento de cp -H e cp -L é idêntico.

Com a opção -R , cp -H apenas cancela links simbólicos que ocorrem no próprio comando cp , enquanto -L também desrefere links simbólicos dentro dos diretórios copiados recursivamente.

O comando

cp -R -H source/ dest/

copiará o diretório source e todo o seu conteúdo dentro do diretório dest . Se source é um link simbólico para um diretório, o cp irá desreferenciar o symlink, isto é, copiar o diretório source points para. No entanto, se o cp encontrar quaisquer links simbólicos nos subdiretórios do source , ele criará links simbólicos na pasta de destino.

O comando

cp -R -L source/ dest/

se comporta de maneira semelhante. No entanto, ele também irá desreferenciar links simbólicos nos subdiretórios source , ou seja, copiar os arquivos para os quais os symlinks apontam.

    
por 08.05.2013 / 21:29
1

A opção -H para cp modifica o comportamento de -R (cópia recursiva) da seguinte forma:

Se -H for não passado, e o caminho de origem fornecido na linha de comando for um link simbólico para um diretório, então o link será copiado para o diretório caminho de destino.

Se -H for passado, e o caminho de origem & c., & c., o link será desreferenciado e o diretório referenciado recursivamente copiado para o caminho de destino.

Isso não ajuda muito, eu acho; talvez um exemplo possa esclarecê-lo melhor. (Em ls -pF output, um / à direita indica um diretório, enquanto um @ à direita indica um link simbólico.)

1  me@box tmp $ for dir in foo bar; do mkdir $dir; done
2  me@box tmp $ ls -pF
bar/ foo/
3  me@box tmp $ touch foo/file
4  me@box tmp $ ln -s foo baz
5  me@box tmp $ ls -pF
bar/ baz@ foo/
6  me@box tmp $ cp -R baz bar
7  me@box tmp $ ls -pF bar
baz@
8  me@box tmp $ unlink bar/baz
9  me@box tmp $ cp -HR baz bar
10 me@box tmp $ ls -pFR bar
bar:
baz/

bar/baz:
file
11 me@box tmp $

Veja como isso funciona? Na linha 6, emiti cp -R sem a opção -H e o link simbólico baz foi copiado para bar/ . Em seguida, na linha 9, emiti cp -HR e cp cancelou a referência baz e copiei recursivamente seu conteúdo (ou seja, o conteúdo de foo/ , conforme a linha 4) em bar/ .

    
por 08.05.2013 / 21:18