O Linux 'cp' copia o symlink em vez do arquivo de destino

1

No meu diretório eu tenho 2 arquivos: um arquivo de texto e um link simbólico para esse arquivo de texto.

base_v21.txt -> base_v001.txt
base_v001.txt

Quando tento copiar base_v001.txt usando o seguinte comando:

# cp base_v001.txt /targetdir

Em vez de base_v001.txt ser copiado, base_v21.txt é copiado.

# ls /targetdir
base_v21.txt

Portanto, mesmo que eu especifique o arquivo que desejo copiar pelo nome completo do arquivo, o link simbólico é copiado.

Eu vi postagens sobre o uso de -L ou -H para remover a referência de links simbólicos, mas isso não se aplica realmente à minha situação, porque estou tentando copiar o arquivo de destino em si; não o link simbólico.

Por que o link simbólico e o arquivo de destino estão no mesmo diretório, não tenho controle sobre isso.

    
por ETD 09.08.2018 / 02:08

3 respostas

2

Copiar para um diretório cria um novo arquivo com o mesmo nome do arquivo de origem no diretório de destino, se um novo nome de arquivo não for fornecido. Então os seguintes comandos vão dar o mesmo resultado:

> cp base_v21.txt /targetdir
> cp base_v21.txt /targetdir/base_v21.txt

Eles criam um novo arquivo chamado "base_v21.txt" com o conteúdo do arquivo no diretório de origem. Neste caso, estes são os conteúdos de "base_v001.txt" por causa do link simbólico. Essencialmente, você está fazendo o seguinte:

> cat base_v21.txt >> /targetdir/base_v21.txt

Portanto, é de se esperar que os seguintes comandos forneçam o mesmo resultado após a cópia:

> cat base_v21.txt
> cat base_v001.txt
> cat /targetdir/base_v21.txt

Você pode ver que isso ocorre com um link físico ou simbólico nos seguintes exemplos:

> touch base_v001.txt
> ln -s base_v001.txt base_v21.txt #create soft link
> cat "test" >> base_v001.txt
> mkdir dir
> cd dir
> cp ../base_v21.txt .
> ls
base_v21.txt

>cat base_v21.txt
test

> ln base_v001.txt base_v21.txt #create hard link
> cat "test" >> base_v001.txt
> mkdir dir
> cd dir
> cp ../base_v21.txt .
> ls
base_v21.txt

>cat base_v21.txt
test
    
por 09.08.2018 / 07:02
0

Tente isso,

deixe o destino ser /tmp/

Se você deseja copiar o arquivo de destino, mas não o symlink ,:

readlink -ne base.txt | xargs -0 cp -t /tmp/
    
por 09.08.2018 / 08:27
0

De fato, esse é um comportamento muito estranho.

Verifique e veja quais argumentos conflitantes (se houver algum) estão com alias para o comando cp . Para fazer isso, execute o comando type . (por exemplo, type cp )

Além disso, você pode tentar executar sua operação com um utilitário alternativo, como rsync , que também tem suporte para manipular links simbólicos (com os argumentos --links --copy-links e --hard-links )

    
por 09.08.2018 / 03:31