ディレクトリをcp
したいのですが、既存のファイルがコピーされたファイルより古くても上書きしたくありません。これはCrontab Bashスクリプトの一部になるため、完全に非対話的に実行したいと思います。何か案は?
-n, --no-clobber
do not overwrite an existing file (overrides a previous -i option)
例:
cp -n myoldfile.txt mycopiedfile.txt
rsync
の使用を検討してください。
rsync -a -v --ignore-existing src dst
コメントによればrsync -a -v src dst
は既存のファイルを更新するので正しくありません。
cp -n
あなたが欲しいものです。 manページを見てください。
RedHatの私のように 'n'オプションがないと思う人には、ソースが既存のものより新しい場合(または既存のものがない場合)にだけファイルを書き込むためにcp -u
を使用できます。
[編集]コメントで述べたように、これは古いファイルを上書きするので、OPが望んでいたとおりではありません。そのためにcevingの答えを使ってください。
これはRedHat上で動作します。
false | cp -i source destination 2>/dev/null
更新 および 上書きしない は別のものです。
Alpine Linux: /以下の答えは単一ファイルの場合のみです:Alpineではcp -n
は動作しません(そしてfalse | cp -i ...
も)ので、解決策は私が見つけた私の場合は次のとおりです。
if [ ! -f env.js ]; then cp env.example.js env.js; fi
上記の例では、env.js
ファイルが存在するかどうかをチェックし、存在しない場合はenv.example.js
をenv.js
としてコピーします。
Cpの一部のバージョンには-no-clobberオプションがありません。その場合:
echo n | cp -vipr src/* dst