表現する方法はありますか: `--link`またはcpの通常のコピー(GNU coreutilsから)にフォールバックしますか?


11

伝えるためにそこの方法であるcpには--link(つまり、ハードリンクを作成する)が、私は、デバイス間のハードリンクをしようとしていた場合にフォールバック?デバイス間のリンクは不可能でありcp、失敗する可能性があります。

私が質問している理由は、これをaで使用したいためGNUmakefile、複雑で長文のコマンドライン(または関数について)よりも、読みやすいコマンドラインを使用したいためです。

問題は、GNU coreutils(7.4および8.13)に対するものです。

注:現在、回避策は(GNU makeレシピ構文)のようになります。

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

もちろん、これにより、デバイス間のリンクの場合は偽のエラーメッセージが表示されますが、2番目のcp呼び出しは成功します。また、これは展開されます(結局のところ、ソースフォームは読みやすいように見えます)。

回答:


8

cpこのオプションはありません。ラッパースクリプトを作成することもできますが、それは非常に簡単です。

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

GNU Coreutils 7.5で--reflinkオプションが導入されました。渡し--reflink=auto、基礎となるファイルシステムがコピーオンライト(BtrfsやZFSなど)をサポートし、コピーが同じデバイス上にある場合cp、新しいiノードが作成されますが、コンテンツはコピーされません。それ以外の場合cpは、通常のコピーを実行します。これはまだハードリンクではありません(ターゲットは常に別のiノードになります)が、ユースケースではおそらくさらに優れています。ただし、コピーオンライトをサポートしていないext4(最近のほとんどの人のように)を使用している場合、これは役に立ちません。


1
おかげで、$$私の場合のdouble はもちろんマクロ内にあるためです。そしてもちろん、あなたのラインは私が使用しているもののバリエーションです。しかし、少なくとも私はこの方法がオプションとして存在しないことを知っているので、自分で用意する必要があります。
0xC0000022L 2013

1
@ 0xC0000022Lちなみに、btrfsがext4に取って代わる数年後には、スクラップlnを使用して使用することができますcp --reflink=auto(私の最新の回答を参照してください)。
Gilles 'SO-悪をやめる'

感謝します。いつかそのオプションを見たことがありますが、気づいていませんでした。
0xC0000022L 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.