Existe-t-il un moyen d'exprimer: `--link` ou de revenir à une copie ordinaire en cp (depuis GNU coreutils)?

11

Y a-t-il un moyen de le dire (c. - cpà --link-d. Créer des liens durs), mais se replier dans le cas où j'essaye des liens durs inter-appareils? Les liaisons inter-appareils ne sont pas possibles et entraîneraient l' cpéchec.

La raison pour laquelle je demande, c'est parce que je voudrais l'utiliser dans un GNUmakefileet préférerais une ligne de commande lisible à une ligne alambiquée et longue (ou une fonction, d'ailleurs).

La question est pour GNU coreutils (7.4 et 8.13).

Remarque: en ce moment, la solution de contournement serait quelque chose comme (syntaxe de recette GNU):

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

Cela donnera bien sûr des messages d'erreur parasites en cas de liaisons inter-appareils, bien que réussissant lors du deuxième cpappel. En outre, cela est ensuite développé (le formulaire source semble lisible après tout), il ne sera plus trop lisible.

0xC0000022L
la source

Réponses:

8

cpn'a pas cette option. Vous pouvez écrire un script wrapper, mais c'est assez simple.

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

GNU Coreutils 7.5 a introduit l' --reflinkoption. Si vous réussissez --reflink=autoet que le système de fichiers sous-jacent prend en charge la copie sur écriture (par exemple Btrfs ou ZFS) et que la copie se trouve sur le même périphérique, alors cpcréera un nouvel inode mais ne copiera pas le contenu; sinon, cpeffectue une copie normale. Ce n'est toujours pas un lien dur (la cible sera toujours un inode différent), mais c'est probablement encore mieux pour votre cas d'utilisation. Cependant, si vous êtes sur ext4 (comme la plupart des gens de nos jours), qui ne prend pas en charge la copie sur écriture, cela ne vous aidera pas.

Gilles 'SO- arrête d'être méchant'
la source
1
Merci, le double $$dans mon cas est bien sûr parce que c'est à l'intérieur d'une macro. Et votre ligne est bien sûr une variation de ce que j'utilise. Mais au moins, je sais de cette façon que cela n'existe pas en option et je dois fournir le mien.
0xC0000022L
1
@ 0xC0000022L Soit dit en passant, dans quelques années, lorsque btrfs supplante ext4, vous voudrez peut-être utiliser scrap lnet use cp --reflink=auto(voir ma réponse mise à jour).
Gilles 'SO- arrête d'être méchant'
merci, très apprécié. Je n'étais pas au courant, bien que j'aie vu cette option à un moment donné.
0xC0000022L