cp -L vs. cp -H

37

Problema

Ao copiar arquivos com cp -H ou cp -L , obtenho os mesmos resultados:

$ ls -l fileA
  fileA -> fileB
$ cp fileA somewhere/ -H
$ ls -l somewhere/
  fileA     # fileA is a copy of fileB, only renamed, with same properties!

Esta resposta aqui descreve as duas opções como semelhantes SEM DEUS usadas em combinação com -R . Não para mim. Soft-como arquivos hardlinked tornar-se renomeado cópias dos arquivos que apontam para a fonte.

Pergunta :

Qual é o uso adequado de cp -H e cp -L ? Esse é o comportamento esperado?


Minha tentativa de resolver : man cp me diz o mesmo para ambas as opções, mas o texto de info cp torna ainda mais confuso para mim. Talvez alguém possa me ajudar a quebrar um pouco isso:

-H If a command line argument specifies a symbolic link, then copy the file it points to rather than the symbolic link itself. However, copy (preserving its nature) any symbolic link that is encountered via recursive traversal.

Isso soa como uma contradição para mim: eu acho que " a natureza de um link simbólico " é que ele aponta para algum lugar ...

-L, --dereference Follow symbolic links when copying from them. With this option, cp cannot create a symbolic link. For example, a symlink (to regular file) in the source tree will be copied to a regular file in the destination tree.

Eu sei que um link simbólico não é um arquivo normal, mas ... admito que estou super desafiado com essa explicação aqui.

    
por erch 12.10.2013 / 04:39

2 respostas

43

Com links simbólicos, as ferramentas têm duas coisas que podem fazer:

  1. Tratar o symlink como um link simbólico ("preservando sua natureza") ou
  2. Tratar o symlink como o tipo de arquivo para o qual ele aponta.

Dizer que -H "preserva sua natureza" não é uma contradição. Considere a alternativa. Se você usar -L , quaisquer links symlinks cp serão abertos e seu conteúdo copiado para o nome do arquivo de destino. Então a fonte era um symlink, mas sua cópia não é um link simbólico. Então, "perdeu sua natureza como um link simbólico".

Considere

$ mkdir subdir
$ echo "some contents" > subdir/file
$ ln -s file subdir/link

# definition of "list", the abbreviated ls -l output used below
$ list() { ls -l "$@" | \
    awk '$0 !~ /^total/ { printf "%s %s\t%s %s %s\n", $1, $5, $9, $10, $11 }' ; }

$ list subdir
-rw-rw-r-- 14   file  
lrwxrwxrwx 4    link -> file

$ cp -rH subdir subdir-with-H
$ list subdir-with-H
-rw-rw-r-- 14   file  
lrwxrwxrwx 4    link -> file

$ cp -rL subdir subdir-with-L
$ list subdir-with-L
-rw-rw-r-- 14   file  
-rw-rw-r-- 14   link  
    
por 12.10.2013 / 17:46
16

A diferença de comportamento entre -L e -H vem quando -r também é especificado. cp não criará links simbólicos em subdiretórios com -L -r , mas usará se você usar -H -r .

    
por 12.10.2013 / 05:17