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 -
hoge
とfuga
の間に半角スペースがあるので注意です。
解説
せっかくなので、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 -
path
とdirname
の間に半角スペースがあるので注意です。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]'
-
前の記事
Xserver(エックスサーバー)にGitをインストールする 2022.11.23
-
次の記事
記事がありません
コメントを書く