ディレクトリをコピーしますが、ターゲットファイルがすでに存在する場合は失敗します。

ディレクトリをコピーしますが、ターゲットファイルがすでに存在する場合は失敗します。

cp -a foo/* bar/fooの内容はbarにコピーされ、既存のファイルを置き換えます。 -nフラグを使用して、cp既存のファイルを上書きしないか、-iファイルを上書きするかどうかを対話的に要求することができます。

質問

  • cpファイルがすでに存在する場合は失敗し、エラーコードを返す方法はありますか?
  • rsyncそれ以外の場合に使用できる他の一般的なツールはありますか?

答え1

Linux

ファイルがLinuxに存在する場合、GNUによるわずかな変更が失敗する可能性がありますnohup。にnohupリダイレクトすると、すべての対話型プロンプトは無視されますが、使用は失敗として扱われます。/dev/nullstdinstdin

$ nohup cp -ia foo/* bar/

掃除する:

$ nohup cp -ia foo/* bar/ 2>nohup.out && rm nohup.out || cat nohup.out
  • デフォルトでおよびにnohupリダイレクトされます。stdoutnohup.outstderrstdout
  • 2>nohup.outstderrファイルにも入れてみてください。
  • && rm || cat成功するとクリアされ、エラーnohup.outが発生するとエラーを出力します。必要なエラー処理を追加/含めるか、すべて削除してcat正常に処理できます。$?
  • 真剣に使用するには、一時ファイルの場所についてよりよく知っておく必要があります(mktemp -d)。

BSD

BSDでは、ゼロ以外の状態が処理され、返される場所stdinにリダイレクトできます。cpn

$ cp -ia foo/* bar/ </dev/null

OSX

驚くべきことに、OSXの動作はBSDとは異なり、スキップされたcpファイルに対してゼロ以外の状態を返します。-n

$ cp -n foo/* bar/

関連情報