tarコマンドでサーバから大量のファイルを高速でダウンロードする

はじめに

リモートサーバにある大量のファイルをまとめてローカルPCにダウンロードする方法です。

逆にローカルからリモートサーバへアップロードするコマンドも最後にあります。

前提

  • ターミナルでコマンド操作ができる
  • サーバにSSH接続ができる

scpとtarコマンド

scpコマンドでも転送可能だが複数のファイルを一個ずつ転送するので、速度的にはとても遅い。

tarコマンドはアーカイブコマンドだが対象ディレクトリを指定することで転送も可能。

高速転送コマンド

最終的なコマンドは以下のようになりました。

$ ssh [username]@[remote-hosts] 'tar zcf - -C [~/path] [dirname]' | tar zxf -

オプションや書き方が複雑で何をやっているかよくわかりませんが、簡単にいうと、sshでリモートホストに接続してtar圧縮コマンドを実行後、パイプでつないでtar解凍コマンドでローカルに保存しています。

例えば、~/public/hoge/fugaをローカルに保存したい場合。(ローカル側の保存したい場所で実行します)

$ ssh [username]@[remote-hosts] 'tar zcf - -C ~/public/hoge fuga' | tar zxf -

hogefugaの間に半角スペースがあるので注意です。

解説

せっかくなので、scpコマンドから順に説明していきます。

scpコマンド

scpコマンドは、cpコマンド(ファイルコピー)をリモートホスト間で行うコマンド。

書式

scp [オプション] コピー元 コピー先

リモート → ローカル

ローカルの保存先フォルダ内で以下のコマンドを実行。

$ scp [username]@[remote-hosts]:[~/filename] ./

コピー先の./はカレントディレクトリを意味しています。.だけでもいいです。

XSERVERの場合
$ scp -P 10022 [username]@[svxxxx.xserver.jp]:[~/domain.com/public_html/filename] ./

XSERVERのSSHポートは22ではなく10022なので、-Pオプションでポートを指定する必要があります。指定しないとデフォルトの22が指定されます。

ディレクトリごと転送する場合
$ scp -r -P 10022 [username]@[svxxxx.xserver.jp]:[~/domain.com/public_html/directory] ./

-rオプションで対象のディレクトリ内のすべてのファイルを対象にできます。

tarコマンド

tarコマンドは、複数のファイルをアーカイブ(1まとまり)にするコマンドです。オプションで圧縮したり解凍したりすることもできます。

書式

tar [オプション] 保存ファイル名 対象ファイル

tarコマンドについての詳細は省略しまして、本題の高速転送コマンドをみていきます。

圧縮と転送

事前にサーバ側でtarコマンドで圧縮してから、ローカルでscpコマンドを実行しても良いですが、以下のように書くと圧縮と転送が同時にできます。

$ ssh [username]@[remote-hosts] 'tar zcf - -C [~/path] [dirname]' | tar zxf -

pathdirnameの間に半角スペースがあるので注意です。path-Cオプションの値です。目的のディレクトリまでのパスを書きます。cd(階層移動)するイメージです。

以下のように書くとわかりやすいかもです。

$ ssh [username]@[remote-hosts] 'cd [~/path]; tar zcf - [dirname]' | tar zxf -

行末や途中にある-ハイフンは標準出力を意味しています。保存ファイル名の代わりに-ハイフンにするとファイルへ出力せずに標準出力します。これを利用してパイプ前の出力をパイプ後に受け取り保存しています。

オプション補足

zcf gzip圧縮(圧縮しない場合はcf(複数ファイルをまとめる)だけでOK)
zxf gzip解凍(圧縮していない場合はxfだけでOK)
-C ディレクトリ指定
他にもいくつかオプションがありますが、ここでは省略します。

XSERVERの場合
$ ssh -p 10022 [username]@[svxxxx.xserver.jp] 'tar zcf - -C [~/domain.com/public_html/path] [directory]' | tar zxf -

scpコマンドの場合と同様にポート指定が必須です。

まとめ

tarコマンドで圧縮と転送を同時にできる事がわかりました。scpコマンドと比べて圧倒的に速いです。圧縮する場合はサーバのリソースが消費されるので、あまり大量のファイルの場合は圧縮せず-cfオプションの方がいいかもです。

ローカルからリモートサーバへ転送する場合は以下のようにすればOKです。

$ tar zcf - [dirname] | ssh [username]@[remote-hosts] 'tar zxf - -C [~/path]'