cp -a foo/* bar/
foo の内容を bar にコピーし、既存のファイルを置き換えます。-n フラグを使用すると、cp
既存のファイルを上書きしないようにしたり、-i
ファイルを上書きするかどうかを対話的に尋ねたりすることができます。
質問
cp
ファイルがすでに存在する場合に失敗してエラー コードを返す方法はありますか?- そうでない場合、
rsync
または他の一般的なツールを使用して実行することは可能ですか?
答え1
リナックス
Linux 上にファイルが存在する場合は、GNU を使用したわずかなハックにより失敗する可能性がありますnohup
。は にnohup
リダイレクトされるため、対話型プロンプトは無視されますが、 の使用は失敗として扱われます。/dev/null
stdin
stdin
$ nohup cp -ia foo/* bar/
少し整理すると:
$ nohup cp -ia foo/* bar/ 2>nohup.out && rm nohup.out || cat nohup.out
- デフォルトではおよび にリダイレクトさ
nohup
れます。stdout
nohup.out
stderr
stdout
2>nohup.out
stderr
ファイルにも入れます。- は
&& rm || cat
、成功した場合はクリーンアップし、エラーの場合は からエラーを出力しますnohup.out
。 の代わりに/を含めて、必要なエラー処理を追加したりcat
、それをすべて削除して を$?
通常どおり処理したりできます。 - これを本格的に使用する場合は、一時ファイルの場所についてもう少し賢く考える必要があります (
mktemp -d
)
BSDA の
BSD では、stdin
にリダイレクトするcp
ことができ、 として扱われn
、 0 以外のステータスが返されます。
$ cp -ia foo/* bar/ </dev/null
OSX
驚くべきことに、 OSX ではBSD とは異なる動作をし、スキップされたファイルに対してcp
0 以外のステータスを返します。-n
$ cp -n foo/* bar/