私はこのコマンドに初めて触れました。ローカルフォルダをgzipに圧縮し、リモートサーバーで解凍しようとしています。問題は、gzipの圧縮と解凍がすぐに行われるべきです。私はたくさん試してみましたが、最も近いものの1つは次のとおりです。
tar cf dist.tar ~/Documents/projects/myproject/dist/ | ssh [email protected]:~/public_html/ "tar zx ~/Documents/projects/myproject/dist.tar"
上記のように、distフォルダをリモートサーバーに送信しようとしていますが、その前にフォルダを即座に圧縮したい(上記のコマンドでは、これは起こらないようです。)。
- ローカルフォルダ:
~/Documents/projects/myproject/dist/
- リモートフォルダ
~/public_html
:(直接展開してオンラインに切り替える)
もちろん、gzipで生成されたファイルは存在してはならず、すぐに発生するはずです。
私の意図はsh file.command
。プロジェクトを変更するたびにこれを手動で実行したくありません。dist
sh
答え1
rsync
次に、既存のファイルを使用して違い(ファイルの別の部分)のみを転送できるようにする場合は、
rsync -az ~/Documents/projects/myproject/dist/ [email protected]:public_html/
--delete
毎回ターゲットディレクトリツリーを完全に上書きするには、フラグを追加します。何が起こっているのかを確認するには、を追加してください-v
。
1つがなければ、あまりrsync
効率的ではないこのソリューションを使用するだけでtar
十分です。
( cd ~/Documents/projects/myproject/dist && tar czf - . ) |
ssh [email protected] 'cd public_html && tar xzf -'
圧縮されたタールボールの書き込みと読み取りは、次のように行われます。標準出力そして標準入力(-
ファイル名)。 GNUを使用している場合は、処理する前に正しいディレクトリを設定tar
できますが、-C
ここでは古い(伝統的な?cd
)を使用しています。v
何が起こっているかを確認するには(受信側)フラグを追加しますtar xzvf ...
。
答え2
tar
ディスクにファイルを作成する代わりに、出力を STDOUT に送信する必要がある場合は、ssh を使用して有線で送信できます。
$ tar -zcf - /path/to/files | ssh user@host "tar -zx - -C /path/to/destination"
ファイル名を使用するときは、「-」文字を参照してください。このコマンドは、送信 tar に STDOUT への書き込みを指示し、受信 tar に STDIN からの読み込みを指示します。アーカイブデータはローカルディスクに書き込まれません。
sshでログインしたときにパスを指定することはできないので(少なくとも方法はまったく知りませんでした)、tar
受信者に出力を書き込む場所を知らせる必要があります。これがまさにその目的です-C /path/to/destination
。
現在作成されているように、このコマンドはファイルがローカルディレクトリにネストされたリモート側に書き込まれるようにします。
/path/to/files/index.html --> /path/to/destination/path/to/files/index.html
代わりにしたい場合は、/path/to/destination/index.html
こう言います。
$ tar -zcf - -C /path/to/files . | ssh user@host "tar -zx - -C /path/to/destination"
答え3
tar
tarballがファイルに書き込まれるように指示していますdist.tar
。このコマンドを使用すると、tarball はリモートコンピュータに送信されません。
を使用してtar
出力を作成する必要があります。ハイフンはを意味します。オプションを追加すると、tarはtarballを作成する前に圧縮します。これは、tarballをリモートシステムに送信するときのすべてのユースケースの99%で良い考えです。stdout
-f -
stdout
-z
stdout
リモート側ではtar -x
。あなたの例では、-z
リモート側でのみ選択できます。これはまったく論理的ではありません。両方とも同じ圧縮方法を選択する必要があります。つまり、-z
両側に使用したり、両側に使用しないことです。
これはあなたに役立つかもしれません
tar -czf - ~/Documents/projects/myproject/dist/ | ssh [email protected] "tar -C ~/public_html/ -xzf -"
(免責事項:試してみませんでした。バグがある可能性があります。)
リモコンはtar
tarballで読む必要があるため、stdin
ここでもファイル名を提供しません。
答え4
あなたは2つのことを達成しようとしています:
- ディレクトリツリーをリモートサイトにコピーする
- 転送中のデータ圧縮
他の回答では、両方の目標を達成するrsyncの使用について言及しています(rsyncに「-z」オプションを指定すると圧縮が可能です)。
tarは目標#1を達成するための優れたツールであり、コマンドラインオプション(他の回答で提供されている「z」フラグなど)を使用すると、目標#2も達成できます。
SSH接続自体を使用して圧縮目標を達成することもできます。 SSHにはデフォルトでオフになっていますが、コマンドラインまたはssh_configファイルで有効にできる圧縮オプションがあります(参照:https://linux.die.net/man/5/ssh_config)。圧縮が有効になっているSSHバージョン2は、「gzip -6」圧縮を使用して取得した圧縮レベルと同じです。
これらのオプションをすべて組み合わせる際の最善の点は、パイプラインを調整して最良の結果を得ることができることです。 SSH接続で圧縮を有効にするか、tar / rsyncレベルで圧縮を有効にするなど、どちらがより良いパフォーマンスを提供するかを試す必要があります*。
Tarはさまざまな圧縮オプション(gzip、bzip2、lzmaなど)を使用でき、rsyncの「-z」オプションを使用するとgzip圧縮が有効になります。パイプラインの各端に別々の圧縮/圧縮解除プログラムを追加して圧縮レベルを調整することもできます。以下は、SSH接続で圧縮を明示的に無効にしながらbzip2圧縮を追加する例です。
tar cf - ~/Documents/projects/myproject/dist/ | bzip2 -c -9 | ssh -o Compression=no [email protected] "bunzip2 -c | tar -C ~/public_html/ -xf -"
*「パフォーマンス」を測定するには、CPUの負荷、ネットワークのバイト数、圧縮の実行に必要な時間など、アプリケーションにとって最も重要なものが何であるかを判断する必要があります。パイプラインを調整して測定を実行して、圧縮レベルの変更とパイプラインで圧縮を適用する場所がこれらの変数にどのように影響するかを確認できます。
パイプラインの複数のポイントで圧縮を有効にしてもパフォーマンスが向上しない場合があります。