cpのターゲットパスがディレクトリの場合、そのディレクトリにファイルが誤って生成されるのを防ぐにはどうすればよいですか?

cpのターゲットパスがディレクトリの場合、そのディレクトリにファイルが誤って生成されるのを防ぐにはどうすればよいですか?

私の理解はcp src dest次のとおりです

  1. srcファイルであり、存在しないがdest親ディレクトリが存在する場合はdest作成します。
  2. srcファイルでファイルの場合は、そのdest内容destで上書きされますsrc
  3. srcファイルとdestディレクトリの場合はdest/src作成します。

私は状況#3を避けようとしています。仮定してスクリプトを書くとdest に慣れるディレクトリですが、実行時に見つかりました。はい、cpファイルを変なところに入れたくないし、静かに続けたい。

代わりに、私は以下が欲しい:

  • ディレクトリ全体destを削除し、必要なファイルに置き換えます。
  • 何もしないでエラーが発生します。

私もこれが原子的に起こりたいです。 TOCTTOUの問題は、別のコマンド(ディレクトリがあるかどうかを確認するなどtest -d)を使用して発生する可能性があります。dest

これは可能ですかcp?それ以外の場合は、他の同様の汎用コマンドを使用して実行できますか?

私はポータブルソリューションと非標準拡張に依存するソリューション(合理的に一般的な場合)の両方に興味があります。

答え1

リダイレクトがまさにその役割を果たします。これは'sと同じように機能しますcp-T, --no-target-directoryディレクトリの場合はエラーで終了します)。dst

$ cat src > dst

答え2

絶対互換性に関する限り、コピーを試みる前にターゲットディレクトリを確認できます。

何か間違っていたり、

[ -d dest ] && echo "${0##*/}: is a directory: dest" >&2 && exit 1
cp src dest

または自動的にターゲットを削除

[ -d dest ] && rm -rf dest
cp src dest

ディレクトリを削除してファイルに置き換えるために使用できるアトミック操作はありません。 (のようなコマンドを見つけることができますが、cp --no-target-directory基本的な作業は依然として基本的に原子的ではありません。

関連情報