scpはディレクトリを再帰的にコピーできますか?


572

現在、単一の.tarファイルのみをコピーできます。しかし、どのようにしてディレクトリを再帰的にコピーできscpますか?

回答:


936

うん、使用-r

scp -rp sourcedirectory user@dest:/path
  • -rは再帰を意味します
  • -pは、元のファイルの変更時間、アクセス時間、およびモードを保持します。

注:これによりsourcedirectory内部/pathが作成されるため、ファイルは/path/sourcedirectory


9
ただし、これはシンボリックリンクを保持しないことに注意してください。
CpnCrunch

12
ことに注意してください-pr(逆の順序でオプションが)フォルダをコピーしません、バリではなく、ターゲットディレクトリにその内容(オプション事項の明らかに、順序)。
pms

172

前の回答は技術的には正しいですが、rsync代わりに使用することも検討する必要があります。 rsync送信側と受信側のデータをdiffメカニズムで比較するため、以前に送信されたデータを再送信する必要はありません。

何かをリモートマシンに複数回コピーする場合は、を使用しますrsync。実際には、rsyncファイルのアクセス許可と所有権をコピーしたり、特定のファイルやディレクトリを除外したりするなど、より多くのコントロールがあるため、毎回使用するのが良いでしょう。一般に:

$ rsync -av /local/dir/ server:/remote/dir/

ローカルディレクトリをリモートディレクトリと同期します。2回目に実行し、ローカルディレクトリの内容が変更されていない場合、データは転送されませんscp。毎回すべてを実行してコピーするよりもはるかに効率的です。

また、rsyncとは異なり、中断された転送から非常に簡単に回復できますscp

最後に、最新のバージョンはrsyncデフォルトでsshを介して実行されるため、scpすでに動作している場合はrsync、ドロップインの代替品になるはずです。


1
rsyncはより効率的であることに同意します。現在行われていないことの1つscpは、リモートホスト間でのコピーを許可することです(少なくともそれらの1つでrsyncクライアントを実行せずに)。
セドリックナイト

1
-av:vは詳細、アーカイブ用であり、-rlptgoDへのショートカットであり、再帰を意味し、権利所有者の日付とリンクを保持します。あなただけの再帰的な使用したい場合は-r
pdemを



6

最良の方法はSSH経由でrsyncを使用することです

rsync -a -essh /source/ user@dest-server:/dest/

rsync -a -essh user@source-server:/source/ /dest/

私のお気に入りのオプションは-Pazvessh --deleteです。

  • -a:アーカイブモード(シンボリックリンクの保持など、多くのデフォルトの共通オプションを含む)
  • -z:圧縮
  • -v:詳細:ファイルを表示
  • -P:完了したファイル/残りのファイルとして進行状況を表示します
  • -e ssh:sshプロトコルでrsyncを実行します
  • --delete:ソースにもうない宛先のファイルを削除します

rsync私が使用したすべてのバージョンがsshデフォルトで使用さ-esshれるため、必要になることはほとんどありません。また、リモートホストへの接続に使用するコマンドの選択は、再帰的なコピーとはまったく関係ありません。
カスペルド

4

再帰的コピーフラグを探し、この投稿のおかげでそれを正常に使用した後、提案を投稿したいと思います。

ケースがディレクトリを(再帰的に)コピーしている場合。ファイルが圧縮されて送信される場合、転送の時間を節約できる可能性があります

私が最後にしたことは:

local$ tar -czvf local.tar.gz directory/
local$ scp local.tar.gz user@remote:/directory
ssh user@remote
remote$ tar -xzvf local.tar.gz

お役に立てれば


ファイルの拡張子のいずれかでなければならない.tar.gzか、.tgzファイルがgzip圧縮されたtarアーカイブであるので(ので-zフラグが使用されています)。
アンソニーベル

2

次の単純なコマンドを使用して、ディレクトリを圧縮アーカイブに再帰的にコピーできます。

ssh -p 22 user@address-to-copy-from.com  'cd /parent/directory && tar zcvf - directory_to_copy' > /destination/on/your/machine/archive_name.tgz

たとえば、/var/logfromのコンテンツをコピーするにはdomain.com~/logs.tgz次を実行します。

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' > ~/logs.tgz

パイプを使用して、ターゲットシステム上のファイルを抽出することもできます。このコマンドは、の内容をコピーします/var/logdomain.com~/destination/logシステム上:

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' | tar xzf - -C ~/destination

ディレクトリをミラーリングするには、おそらく使用する必要がありますrsync...


1

対話形式で入力するのではなく、ユーザーのパスワードをパラメーターとして渡す場合は、sshpasssudo apt-get install -y sshpass)を使用できます。

例:

sshpass -p 'remote_password' scp -rp /src/folder myremoteusername@122.10.12.123:/dest/folder

0

scpコマンドで-rオプションを使用すると、任意のシステムでディレクトリを再帰的にコピーできます。他に何か必要な場合はscpコマンドのチュートリアルを参照してください。-rオプションは、ほとんどのLinuxコマンドの再帰操作を表します。


本当ですが、この-rオプションは数年前にすでに提案されており、受け入れられている答えです。
RalfFriedl

-3

別の(繰り返し使用する方が良い)オプションは、NFSを使用することです-nfs-kernel-serverとNFS共有のセットアップ方法を確認してください。


2
これは完全なナンセンスです。使用するケースは無限にありますがscp、NFSはオプションではありません。
スヴェン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.