知っている方法cp
(--link
ハードリンクの作成など)がありますが、デバイス間でハードリンクを試みる場合に備えて置き換えることはできますか?デバイス間の接続ができず、cp
エラーが発生します。
私が尋ねる理由は、これをGNUmakefile
コマンドラインで使用したい、複雑で長いコマンドライン(または機能)ではなく読みやすいコマンドラインを好むからです。
問題はGNU coreutils(7.4および8.13)に関するものです。
注:現在のソリューションは(GNU make Recipe構文)に似ています。
cp -fl $^ $@ || cp -f $^ $@
もちろん、デバイス間リンクの場合、2回目のcp
呼び出しが成功しても偽のエラーメッセージが表示されます。さらに、拡張すると(最終的にソースフォームは読みやすいように見えます)、読みやすくなりません。
答え1
cp
そのようなオプションはありません。ラッパースクリプトを書くこともできますが、これは非常に簡単です。
ln -f $^ $@ 2>/dev/null || cp -f $^ $@
--reflink
このオプションはGNU Coreutils 7.5で導入されました。パスし--reflink=auto
、プライマリファイルシステムが書き込み中のコピー(BtrfsやZFSなど)をサポートし、レプリカが同じデバイスにある場合、cp
新しいinodeが作成されますが、内容はコピーされませんcp
。コピーが実行されます。これはまだハードリンクではありませんが(ターゲットは常に別のインデックスノードです)、ユースケースに適している可能性があります。ただし、記録中にコピーをサポートしていないext4を使用している場合(最近ほとんどの人のように)、これは役に立ちません。