私の理解はcp src dest
次のとおりです
src
ファイルであり、存在しないがdest
親ディレクトリが存在する場合はdest
作成します。src
ファイルでファイルの場合は、そのdest
内容dest
で上書きされますsrc
。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
基本的な作業は依然として基本的に原子的ではありません。