Existe uma maneira de expressar: '--link' ou retornar à cópia comum no cp (do GNU coreutils)?

10

Existe uma maneira de dizer cp a --link (ou seja, criar links físicos), mas voltar no caso em que estou tentando hardlinks entre dispositivos? Os links entre dispositivos não são possíveis e podem fazer com que cp falhe.

A razão pela qual estou perguntando é porque eu gostaria de usar isso em um GNUmakefile e preferiria uma linha de comando legível sobre um complicado e demorado (ou uma função).

A questão é para GNU coreutils (7.4 e 8.13).

Nota: agora a solução seria algo como (sintaxe de receita do GNU make):

cp -fl $^ $@ || cp -f $^ $@

Isso, é claro, fornecerá mensagens de erro espúrias no caso de links entre dispositivos, embora tenha sucesso na segunda chamada cp . Além disso, isso é expandido (o formato de origem parece legível, afinal) não será mais legível.

    
por 0xC0000022L 05.02.2013 / 02:12

1 resposta

8

cp não tem essa opção. Você poderia escrever um script wrapper, mas é bem simples.

ln -f $^ $@ 2>/dev/null || cp -f $^ $@

O GNU Coreutils 7.5 introduziu a opção --reflink . Se você passar --reflink=auto e o sistema de arquivos subjacente suportar copy-on-write (por exemplo, Btrfs ou ZFS) e a cópia estiver no mesmo dispositivo, então cp criará um novo inode, mas não copiará o conteúdo; caso contrário, cp executará uma cópia normal. Este ainda não é um link físico (o alvo será sempre um inode diferente), mas provavelmente é ainda melhor para o seu caso de uso. No entanto, se você estiver no ext4 (como a maioria das pessoas hoje em dia), que não suporta copy-on-write, isso não irá ajudá-lo.

    
por 05.02.2013 / 02:35