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

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

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

質問

  • cpファイルがすでに存在する場合に失敗してエラー コードを返す方法はありますか?
  • そうでない場合、rsyncまたは他の一般的なツールを使用して実行することは可能ですか?

答え1

リナックス

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)

BSDA の

BSD では、stdinにリダイレクトするcpことができ、 として扱われn、 0 以外のステータスが返されます。

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

OSX

驚くべきことに、 OSX ではBSD とは異なる動作をし、スキップされたファイルに対してcp0 以外のステータスを返します。-n

$ cp -n foo/* bar/

関連情報