web-dev-qa-db-ja.com

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

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

169
biznez

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

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

(ソース側の/に注意してください。これがない場合、rsync/remote/directory/directoryを作成します。)

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

つまり、ファイルの書き込み権限を一時的に削除することで、ファイルをscpから効果的にスキップさせることができます(ファイルの所有者の場合)。

88
Reimund

日付でコピーできるのは新しいファイルのみです。 findを使用

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

宛先ファイルの内容を読み取り専用にできる場合:

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

scpを実行する前(不満が出て既存のファイルをスキップします)。

そして、後で元に戻します(chmod +wは、umaskベースの値を取得します)。 umaskに従ってすべてのファイルに書き込み権限がない場合は、復元できるように、何らかの方法で権限を保存する必要があります。

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

10
Mohad

大量のファイルをコピーする場合は、ファイルをtarする方が高速です。 -kを使用することにより、ターゲットシステムで解凍するときにtarがファイルを上書きすることも防止できます。

tar -c <source-dir> | ssh <name>@<Host> 'tar -kxzf - -C <target-dir>' 
7
huembi

ストレージにもSFTPしかないため、rsynccsync、または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
bolD

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

  1. 既存のファイルをすべてコピーします

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

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

    cp -r original_files/* ./
    
0
A.Badger