web-dev-qa-db-ja.com

Linuxはどのようにコピーして上書きしないのですか?

ディレクトリをcpしたいのですが、既存のファイルがコピーされたファイルより古くても上書きしたくありません。これはCrontab Bashスクリプトの一部になるため、完全に非対話的に実行したいと思います。何か案は?

309
mnowotka

のmanページからとられた

-n, --no-clobber
              do not overwrite an existing file (overrides a previous -i option)

例:

cp -n myoldfile.txt mycopiedfile.txt
471
hovanessyan

rsync の使用を検討してください。

rsync -a -v --ignore-existing src dst

コメントによればrsync -a -v src dstは既存のファイルを更新するので正しくありません。

74
Hans Ginzel
cp -n

あなたが欲しいものです。 manページを見てください。

48
bucko

RedHatの私のように 'n'オプションがないと思う人には、ソースが既存のものより新しい場合(または既存のものがない場合)にだけファイルを書き込むためにcp -uを使用できます。

[編集]コメントで述べたように、これは古いファイルを上書きするので、OPが望んでいたとおりではありません。そのためにcevingの答えを使ってください。

32
Grim...

これはRedHat上で動作します。

false | cp -i source destination 2>/dev/null

更新 および 上書きしない は別のものです。

27
ceving

Alpine Linux: /以下の答えは単一ファイルの場合のみです:Alpineではcp -nは動作しません(そしてfalse | cp -i ...も)ので、解決策は私が見つけた私の場合は次のとおりです。

if [ ! -f env.js ]; then cp env.example.js env.js; fi 

上記の例では、env.jsファイルが存在するかどうかをチェックし、存在しない場合はenv.example.jsenv.jsとしてコピーします。

7

Cpの一部のバージョンには-no-clobberオプションがありません。その場合:

  echo n | cp -vipr src/* dst
0
Octavian