web-dev-qa-db-ja.com

リモートディレクトリのローカルtarファイルの作成方法

この link は、タールファイルをコピーして、ネットワーク経由で送信される日付の量を最小限に抑える方法を説明しています。私は少し違うことをしようとしています。

さまざまなサブディレクトリレベルにいくつかのリモートファイルがあります。

remote:/directory/subdir1/file1.ext
remote:/directory/subdir1/subsubdir11/file11.ext
remote:/directory/subdir2/subsubdir21/file21.ext

そして、私はそれらすべてをリストしたファイルを持っています:

remote:/directory/allfiles.txt

それらを最も効率的にコピーするために、リモートサイトで私はただすることができました

tar zcvf allfiles.tgz `cat /directory/allfiles.txt`

しかし、それを行うのに十分なスペースがありません。

ローカルディスクに十分なストレージスペースがあります。リモートサーバーからの着信ストリームをtarする方法はありますか(転送にscpまたはsshを使用)?

何かのようなもの /localdir$ tar zc - | ssh remotecat/directory/allfiles.txt`推測しますが、ローカルホスト上のリモートファイルのみが一覧表示されます。

5
alle_meije

ほぼ正しく、ローカルではなくリモートホストでtarを実行するだけです。コマンドは次のようになります。

ssh remote_Host tar cvfz - -T /directory/allfiles.txt > remote_files.tar.gz
6
dirk

ローカルディスクに十分なスペースがあり、目標がネットワーク経由で送信される日付の量を最小限に抑えるためである場合は、scpまたは-で圧縮を有効にするだけで十分かもしれません。 rsync

scp -avrC remotehost:/path/to/files/file1 /files/file2 ...  local/destination/path

もちろん、tarを使用しなくても、小さなスクリプトを実行して各ファイルをループし、scp圧縮転送を実行できます。 rsyncですべてがより居心地が良くなります

rsync -avz --files-from=FILE remotehost:/path/to/files  local/destination/path

ssh経由でリモートホストに接続し、そこに書き込むことができます

tar cvzf - -T list_of_filenames | ssh Local_Hostname tar xzf -

参照:

  • からman scp

    -C      Compression enable.  Passes the -C flag to ssh(1) to enable compression.
    
  • からman rsync

    --files-from=FILE       read list of source-file names from FILE
    -z, --compress          compress file data during the transfer
    --compress-level=NUM    explicitly set compression level
    
1
Hastur

開始コマンドを実行した場合:

tar zcvf allfiles.tgz `cat /directory/allfiles.txt`

次に、ファイルがリモートで終了することを確認するだけです。それで、tarを標準出力にしましょう。それをパイプして、netcatsandがローカルファイルとして保存します。

または、次のようなものです。

地元: nc -l 1234 | gunzip | tar zcvf allfiles.tgz
リモート:cat /directory/allfiles.txt | gzip | nc localIP 1234

説明:

ローカル、ステップ1:netcatからの入力。 -lいくつかのポートでリッスンします。必要な場所に出力を送信します。
リモート:ステップ1:youyrはすでにファイルのリストを終了しています。最小限のネットワークデータのためにgzip圧縮されています。結果をローカルに送信します。
local:ステップ2:うーん、すでにgzip圧縮されたファイルを取得しています。それらをtarに供給する前に、それらを解凍しましょう。

0
Hennes

使用する帯域幅の量を減らすためにデータを可能な限り圧縮したい場合は、次のようにxzツールを使用してtarコマンドを実行できます。

ssh Host 'tar cvf - -T /directory/allfiles.txt | xz -9' > files.tar.xz

余分な一重引用符(')に注意してください。パイプはローカルシェルではなくリモートシェルで実行する必要があるため、これらが必要です。

ただし、注意すべきいくつかの欠点があります。

  1. このプロセスは大量のメモリ(約700Mb)を使用するため、スワッピングを開始しないように、サーバーに十分な空きメモリ(できれば約1Gb以上)があることを確認する必要があります。
  2. -9を使用する場合、xzコマンドは非常に遅くなります。 CPUを何時間も使用するために追加料金を支払わない場合(Gbのデータを転送する場合...)、問題はないはずです。
  3. また、単一のCPUのみを使用するため、ここでは良いことかもしれません。いずれにせよ、その間、1つのCPUが100%の使用率で固定されます。

それでも、帯域幅がサービスの中で最も高価な部分である場合は、可能な限り最高の圧縮を使用することをお勧めします。

圧縮するとダウンロードの速度が遅くなることに注意してください。サーバーのディスクドライブに十分なスペースがある場合は、サーバー上にtarballを作成してみて、そのプロセスが完了したら、1回の高速転送を実行します。接続が少し不安定な場合、上記のsshコマンドが途中で中断し、プロセス全体を再起動する必要があるためです...それが実際の問題である場合、rsyncを使用すると確実にあなたの最善の策。 rsyncの利点は、ファイルを一度に1つずつ送信し、中断したところから再開できることです。また、データを圧縮しますが、私が知る限り、gzipしか認識していません(ただし、確認してからしばらく経ちましたが、より優れたコンプレッサーをサポートするようになりました)。

0
Alexis Wilke