まぁ言い出しっぺなんで、一応解説します。
その前に、前の質問では自分は「cfCm」とか「xfCm」とか、「m」のオプションは指定していませんでしたが、ご自身で意図してつけてますか?
別にそうであれば問題ありませんが、とりあえずこれは抜きで話をします。
まずは、ssh抜きで話をしましょう。
tarのオプションについて、ちょっと癖があるので分かりづらいと思います。
tar cfC - /home/userA/dir .
tar xfC - /home/userB/dir
は、
tar -c -f - -C /home/userA/dir .
tar -x -f - -C /home/userB/dir
と同様の意味を持ちます。
前者で使われている事が多いですが、今回はわかりやすいように後者の方で説明します。
オプション | 内容 |
---|
-c | tarファイルを作成する |
-x | tarファイルを展開する |
-f <tarファイル名> | tarファイル名の指定 |
-C <ディレクトリ名> | そのディレクトリにcdし、処理をする |
tarファイルは、複数のファイルをまとめて、一つのファイルにアーカイブするコマンドです。
その際には、ファイルのパーミッション・更新日付などを含めて アーカイブします。
つまり、
bash
1cd /home/userA/dir
2tar -c -f /tmp/tmp.tar .
3cd /home/userB/dir
4tar -x -f /tmp/tmp.tar
というように、tarファイルにアーカイブしそれを展開すれば、(「/tmp/tmp.tar
」というファイルができている事を除けば)パーミッション・更新日付などを保ったままコピーした事と同等になります。(細かい違いはあるかもしれませんが)
更に、先に説明したとおり「-C
」オプションでディレクトリを変更する事ができますので、
bash
1tar -c -f /tmp/tmp.tar -C /home/userA/dir .
2tar -x -f /tmp/tmp.tar -C /home/userB/dir
というようにコマンドを一回で実行する事ができます。
さて、そもそもなんでディレクトリを変更しなければならないか、ですが、tarコマンドはファイル名を実行時のディレクトリからの相対パスそのままで保存します。
この辺りは、やってみたほうが早いと思います。
上記の方法と、
bash
1tar -c -f /tmp/tmp.tar -C /home/userA dir/.
2tar -x -f /tmp/tmp.tar -C /home/userB/dir
とでどう違うか、確認してください。
次に、「-f -
」です。
「-f
」オプションはtarファイル名の指定と説明しましたが、tarファイル名に「-
」を指定すると、作成モードの場合にはtarファイルの内容を標準出力に出力し、展開モードの場合にはtarファイルを標準入力から読み込みます。
ですので、パイプを使用して、
bash
1tar -c -f - -C /home/userA/dir . | tar -x -f - -C /home/userB/dir
とすれば、標準入出力を介してtarファイルをやり取りするので、tarファイルが残る事はありません。
ここまでで、tarファイルによるローカルでのコピーの説明になります。
次にsshです。
とした場合、serverBにuserAというユーザでログインする事になりますが、正確には「ログインしコマンドを実行する。指定がなければログインシェルを起動する」という事です。
後ろにコマンドを付加すると、そのコマンドを実行します。
また、sshは自身の標準入力をログイン先で実行したコマンドの標準入力に送り、ログイン先の実行したコマンドの標準出力を自身の標準出力に出力します。
つまり、
bash
1tar -c -f - -C /home/userA/dir . | ssh userA@serverB tar -x -f - -C /home/userB/dir
と実行すれば、先に説明したコピー処理を、sshを介してネットワーク越しに処理できるのです。
説明が下手なのでこんな説明でわかるかどうか怪しいですが、とりあえず上記のことを踏まえて、もう一度調べ直してみてください。