web-dev-qa-db-ja.com

コピー中にSCPにシンボリックリンクを無視させることは可能ですか?

私たちのサーバーの1つを再インストールする必要があり、予防策として、/home/etc/opt、および/Servicesサーバーをバックアップします。

しかし、問題があります:シンボリックリンクがたくさんあるため、多くのファイルが複数回コピーされます。

scpにシンボリックリンクを無視させる(または実際にリンクをディレクトリまたはファイルとしてではなくリンクとしてコピーする)ことは可能ですか?そうでない場合、別の方法がありますか?

71
Kris_R

私はそれが可能であることを知っていた、私はちょうど間違ったツールを取りました。 rsyncでやった

rsync --progress -avhe ssh /usr/local/  XXX.XXX.XXX.XXX:/BackUp/usr/local/
73
Kris_R

rsyncメソッド は機能しませんでしたが、このWebサイトで機能する代替手段を見つけました( www.docstore.mik.ua/orelly )。

具体的には 「O'Reilly:SSH:The Secure Shell。The Definitive Guide」の7.5.

7.5.3。ディレクトリの再帰コピー

...

Scpはディレクトリをコピーできますが、必ずしも最良の方法とは限りません。ディレクトリにハードリンクまたはソフトリンクが含まれている場合、それらは複製されません。リンクはプレーンファイル(リンクターゲット)としてコピーされ、さらに悪いことに、循環ディレクトリリンクはscp1を無限にループさせます。 (scp2はシンボリックリンクを検出し、代わりにターゲットをコピーします。)名前付きパイプなどの他の種類の特殊ファイルも正しくコピーされません。 SSH経由で展開するマシン:

$ tar cf - /usr/local/bin | ssh server.example.com tar xf -
27
Luke

tar over sshを送信者と受信者の両方として使用すると、同様にトリックが行われます。

cd $DEST_DIR
ssh [email protected] 'cd $REMOTE_SRC_DIR; tar cf - ./' | tar xvf -
16
Vojtech Vitek

1つの解決策は、シェルパイプを使用することです。少し短い名前で同じ* .gzファイルにリンクするために、いくつかのソフトウェアによって生成された* .gzファイルとシンボリックリンクを取得した状況があります。単純にscpを使用すると、シンボリックリンクが通常のファイルとしてコピーされ、重複が生じます。 rsyncはシンボリックリンクを無視できることは知っていますが、gzファイルは同期可能なオプションで圧縮されておらず、これらのgzファイルのコピーでは同期が非常に遅くなります。そのため、次のスクリプトを使用してファイルをコピーするだけです。

find . -type f -exec scp {} target_Host:/directory/name/data \;

-fオプションは、通常のファイルのみを検索し、シンボリックリンクを無視します。ソースホストでこのコマンドを与える必要があります。これが私の状況で一部のユーザーに役立つことを願っています。何か見逃した場合は教えてください。

1
Kemin Zhou