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

11

Existe uma maneira de dizer cpa --link(ou seja, criar links de disco rígido), mas cair de volta no caso em que eu estou tentando hardlinks inter-dispositivos? Os links entre dispositivos não são possíveis e podem causar cpfalhas.

A razão pela qual estou perguntando é porque gostaria de usar isso em um GNUmakefilee preferiria uma linha de comando legível em vez de uma linha complicada e longa (ou uma função, nesse caso).

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

Nota: no momento, a solução alternativa seria algo como (GNU make sintaxe da receita):

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

Obviamente, isso fornecerá mensagens de erro falsas no caso de links entre dispositivos, embora seja bem-sucedido na segunda cpchamada. Além disso, ele é expandido (o formulário de origem parece legível, afinal) e não será mais legível.

0xC0000022L
fonte

Respostas:

8

cpnão tem essa opção. Você pode escrever um script de wrapper, mas é bem simples.

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

O GNU Coreutils 7.5 apresentou a --reflinkopção. Se você passar --reflink=autoe o sistema de arquivos subjacente suportar cópia em gravação (por exemplo, Btrfs ou ZFS) e a cópia estiver no mesmo dispositivo, cpcriará um novo inode, mas não copiará o conteúdo; caso contrário, cpexecuta uma cópia normal. Ainda não é um link físico (o destino sempre será 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 oferece suporte à cópia na gravação, isso não ajudará.

Gilles 'SO- parar de ser mau'
fonte
1
Obrigado, o dobro $$no meu caso é claro, porque isso está dentro de uma macro. E sua linha de curso é uma variação do que estou usando. Mas pelo menos sei dessa maneira que não existe como uma opção e preciso fornecer o meu.
0xC0000022L
1
@ 0xC0000022L A propósito, em alguns anos, quando o btrfs suplantar o ext4, você poderá usar sucata lne uso cp --reflink=auto(consulte minha resposta atualizada).
Gilles 'SO- stop be evil'
obrigado, muito apreciado. Não estava ciente disso, embora eu já tivesse visto essa opção em algum momento.
0xC0000022L