宛先の既存のファイルを置き換えないscp


158

宛先ディレクトリのコンテンツを置き換えずに、ディレクトリ全体を同じ名前のディレクトリにコピーするにはどうすればよいですか?(代わりに、宛先フォルダのコンテンツに追加したい)


はい、有用なプログラム/ユーティリティに「もしそれしかできなかったら...」というオプションがないの迷惑です!この場合、「-noclobber」!
MikeW

回答:


139

元のディレクトリの新しいファイルのみを更新する場合、または宛先にすでに存在するすべてのファイルをスキップする場合はrsync、を使用して渡します。-u--ignore-existing

rsync -au /local/directory/ host:/remote/directory/
rsync -a --ignore-existing /local/directory/ host:/remote/directory/

/ソース側に注意してください:これrsyncがないと作成されます/remote/directory/directory。)


@Anthon私はあなたのコメントを理解していませんし、チャンドラによる答えもコメントも見ません。--ignore-existing置き換えずに追加すると、どのようなデータの損失が発生しますか?
ジル

申し訳ありませんが、--ignore-existing data-lossは発生しないはずである場合、データ損失が発生する可能性のある最初の例を見てください(OPが要求したものではありません)。
アントン

リモートシステムが持っていない場合、これが解決しないrsync容易に入手する(Win32の-OpenSSHのような)....
ゲルトファンデンベルグ

@GertvandenBerg rsyncはWindowsに簡単にインストールでき、SSHほど難しくありません。
ジル

@Gilles:確かに、すべてのオプションにCygwin DLLが関係しているようです...(OpenSSHのMSポートの現在の状態は、SCPで圧縮を有効にすればSCPを破壊するのに十分です...)(Win32でrsync機能を取得する-OpenSSHも非自明なようだ-うまくいけば)時間をかけて改善している(Solaris 10のサードパーティ製のパッケージとは、他の例として、ある--rsync-path必要があるが)
ゲルトファンデンベルグ

82

scpは、ファイルへの書き込み権限がある場合、ファイルを上書きします。

言い換えるscpと、それらのファイルの書き込み許可を一時的に削除することにより、ファイルを効果的にスキップできます(ファイルの所有者である場合)。


5
これをありがとう。まさに私が探していたトリックでした。
サッカリン

*を追加してファイルをコピーしてください。例scp -r user@server.com:/location/of/files/* /local/location/
リック

1
見つける 。-type f -exec chown root:root {} \;

1
ディレクトリ内の一部のファイルのみが上書きされることが予想される(「保護」されていない場合)、ファイルのアクセス許可がファイル間で統一されていないというまれなケースでは、このソリューションは機能しない場合があります。それ以外の場合は、非常にシンプルで効果的です。
sancho.s

Windowsでこれを行うには、すべてのファイルを選択し、右クリック->プロパティ->読み取り専用
-BenJammin

12

日付ごとに新しいファイルのみをコピーできます。つかいますfind

scp  `find /data/*.gz -type f -mtime +7` USER@SERVER:/backup/

+7はどういう意味ですか?
フランシスキム

@FrancisKimは、7日前に変更されたことを意味します。したがって、このクエリは、過去7日間に変更された* .gzファイルを選択します
Vadim Eremeev

4
+7は実際には7日以上前を意味しませんか?
ジェフH.

1
はい、「7日以上前」という意味です。誰がこれを支持したかわかりません。
ステファンライヒ

9

宛先ファイルのコンテンツを読み取り専用にできる場合:

find . -type f -exec chmod a-w '{}' \;

実行する前にscp(文句を言い、既存のファイルをスキップします)。

そして、それらを後で変更します(chmod +wumaskベースの値を取得するため)。ファイルにすべてのumaskによる書き込み許可がない場合は、何らかの方法でそれらを復元できるように許可を保存する必要があります。

(Gillesの回答は既存のファイルがローカルの方が新しい場合は上書きされます。そのようにして貴重なデータを失いました。その間違った有害な回答がどうして多くの賛成票を持っているのか理解できません)。


2
わかりません。どのようにしてrsync --ignore-existingデータが失われましたか?
ジル

4
find: missing argument to '-exec'このコマンドを使用してエラーが発生したため、代わりに:を使用する必要がありましたfind . -type f -exec chmod a-w {} \;。私のLinuxは悪いです、ymmv。
wpearse

これはより良い、より安全な答えです。@wpearseが述べたようにパーミッションを変更するための正しいコマンドは次のとおりです。find . -type f -exec chmod a-w {} \;
アミール

6

私は、私の場合、私は使用できませんでした、同様のタスクを持っていたrsynccsync私のストレージのみSFTPを持っているため、またはFUSE。rsyncファイルの日付と時刻を変更できなかったため、他のユーティリティ(などcsync)が他のエラーを表示しました:「一時ファイルを作成できませんクロックスキューが検出されました」。

ストレージサーバーにアクセスできる場合- ここでデーモンとしてインストールopenssh-serverまたは起動rsyncします。

私の場合、これはできませんでした。解決策はlftpでしたlftpの同期化の使用法は次のとおりです。

lftp -c "open -u login,password sftp://sft.domain.tld/; \
    mirror -c --verbose=9 -e -R -L /srs/folder /rem/folder"

/src/folder-は私のPC上のフォルダです/rem/folder-はsftp://sft.domain.tld/rem/folderです。

リンクでmanページを見つけることができます:http : //lftp.yar.ru/lftp-man.html


6

大量のファイルをコピーするには、それらをtarするほうが高速です。-kを使用することにより、ターゲットシステムでtarを展開するときにtarがファイルを上書きすることも防ぎます。

tar -c <source-dir> | ssh <name>@<host> 'tar -kxzf - -C <target-dir>' 

1
リモート接続を確立します。まず、ソースをtarにし、ssh接続にパイプして、リモートシステムで展開します。
huembi

-1

scpファイルを上書きし、それを停止するスイッチはありませんが、途中でコピーしてscpを実行し、既存のファイルをコピーして戻すことができます。例:

  1. すべての既存のファイルを途中までコピーする

    mkdir original_files ; cp -r * original_files/
    
  2. scpを使用してすべてをコピーする

    scp -r user@server:dir/* ./
    
  3. scpが上書きしたものの上に元のファイルをコピーします。

    cp -r original_files/* ./
    

3
この方法は、リモートからファイルをプルして、中断した場所から再開しようとする場合には役立ちません。すなわち、全体の目的が時間を節約することである場合。
オリバーウィリアムズ

-1

これを実現する別の方法はls、宛先フォルダーでを実行することです:

リモート宛先フォルダー:

ls | awk '{print "mv " $1 " ../copied_data/"}' > mv_copied_data
scp mv_copied_data user@source.server.com:/path/to/source/folder

ソースで:

cd /path/to/source/folder
chmod 777 mv_copied_data
./mv_copied_data

目的地で:

scp -r user@source.server.com:/path/to/source/folder /path/to/destination/foldeer

これをしないでください。1. lsを解析しないでください。2.ファイル名に- >スペース改行またはその他の特殊文字が含まれている場合、答えは危険です。3. Pythonスクリプトでforループをハードコーディングします。実行時にプログラムを生成することは、多くの理由から(プロのプログラマーが行ったとしても)難しくて難しいです。シェルスクリプトの生成はさらに悪い-ひどい考えです。
イグニス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.