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


386

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


回答:


589

manページから取られた:

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

例:

cp -n myoldfile.txt mycopiedfile.txt

33
ファイルが存在する場合、これはエラーで終了します。成功して終了するには、試してください cp -n source.txt destination.txt || true
galenandrew

13
cp -nUbuntu 12.04にファイルが存在する場合、@ galenandrew はエラーで終了しません。
amit

@galenandrew確認済み。ありがとうございました。ターゲットに実行スクリプトを追加した後、プロジェクトがXcodeでビルドされませんでした。
Ruiz

@AaronFrankeはそのように見えます。
ボリス

93

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

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

rsync -a -v src dst既存のファイルを更新するため、コメントどおりではありません。


7
--ignore-existingフラグを追加して、既存のファイルが上書きされないようにします。
すべての労働者は必須

7
上記のrsync -a -v --ignore-existing <src> <dst>代わりに、完全なコマンドが実際に正しい答えcp -uです。
ホワイトバード

以前のコピーが中断され、切り捨てられたファイルのみがコピーされた場合、cp -uはそれを再コピーしないと確信しています...しかし--ignore-existingを指定するとrsyncしますか?おそらくどちらでもないので...それでそれらは完全に同等になりますよね?
dagelf 2017

cpが(私の経験では)現在の時刻を使用している間、rsyncはファイルのタイムスタンプを保持します
Stefan Diabo

1
一部のサーバーにはrsyncがありません
mebada

51
cp -n

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


@AaronFrankeはい、再帰的に動作します。
ボリス

33

これはRedHatで機能します。

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

更新はなく上書きでは、何かが異なります。


4
falseここで何をしますか?
Frozen Flame

11
@FrozenFlameが-i質問に回答します。
2014年

もちろん、ARG_MAXを超えるファイルをコピーしようとすると、このコマンドは機能しません。このケースを回避するには、このリンクを確認してください
mginius 2015年

2
また、明らかに、地球が太陽に衝突した場合、このコマンドは機能しません。
ceving

32

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

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


11
OPは、コピーされたファイルよりも古い場合でも既存のファイルを上書きしないように求めたため、-u実際には目的に適合しません。
Andrew Lott 2014

4
善、あなたは絶対的に正しいです。誰もが気付くのにこんなに時間がかかったのには驚きました。
グリム... 14

それはOPが要求したものではないかもしれませんが、Uberspace(Centos 7)に必要なものとまったく同じです。ありがとう!
Thomas Praxl

私は6年前に私が助けることができて嬉しいです:-D
厳しい...

10

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ます。


1

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

  echo n | cp -vipr src/* dst
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.