web-dev-qa-db-ja.com

rsyncを使用してディレクトリツリーを複製し、ファイルへのハードリンクを作成するにはどうすればよいですか?

時々、サーバー上のデータファイルに対していくつかの大きな移行の変更を行う必要があり、これを行うための良い方法を探しています。 rsyncを使用してルートデータフォルダーから始まるディレクトリ構造を複製し、すべての元のファイル(一部はかなり大きい)へのハードリンクを作成することを考えていました。移行先のツリーでは、移行が必要なファイルのみを上書きできます。最後に、2つのmv操作で古いファイルから新しいファイルに安全に切り替えることができます。

しかし、私はrsyncにこれを実行させることができないようです。私は試した

rsync -a --link-dest=$DATA $DATA $DATA/../upgrade_tmp

しかし、ファイルへのハードリンクを作成する代わりに、rsyncはそれらを完全にコピーします。同じソースとリンク先ディレクトリを使用して問題がありますか?

24

rsyncは強力なツールですが、残念なことに、そのパス名のいくつかについて奇妙にうるさいです。

$DATAが絶対パスの場合(つまり、/で始まる場合)、使用する正しいコマンドラインは次のとおりです。

rsync -a --link-dest=$DATA $DATA/ $DATA/../upgrade_tmp

[さて、rsyncの奇妙さについて少しお話ししましょう。末尾の/がソース引数に追加されていることに注意してください。これは、ソースディレクトリ自体ではなく、ソースディレクトリのcontentsを操作するようにrsyncに指示します。 ($DATAには末尾の/がまだ含まれていないと想定しています。)この場合、コンテンツを操作するため、末尾の/。]を追加します。

一方、$DATAが相対パスである場合(つまり、/で始まっていない場合)、--link-destに関するSean Rのコメントは次のようになります。リンク先パスdestinationパスを基準にして解釈されるため、次を使用します。

rsync -a --link-dest=../`basename $DATA` $DATA/ $DATA/../upgrade_tmp

[〜#〜]編集[〜#〜]

最後の注意点として、rsyncはパスを認識しないため、$DATAが絶対パスかどうかに関係なく、2番目のbasenameコマンドラインは機能するはずです。絶対または相対です。

22
Steven Monday

あなたが欲しいのは「cp -al」です:

cp -al $DATA/ $DATA/../upgrade_tmp/
  • -aはrsync -aのように再帰します
  • -lは、ファイルをコピーする代わりにハードリンクします。
15

他のツールよりもrsyncを使用する方が難しいことがわかりました。 rsyncの正しい答えはSteven Monaiの答えですが、これを行う最も簡単な方法は、どちらかを使用することですcp -alまたはpax -rwlのシステムでは-lcpの有効なオプションではありません:

pax -rwl $DATA $DATA/../upgrade_tmp

または

cp -al $DATA/ $DATA/../upgrade_tmp/

rsync--link-destオプションは、現在のディレクトリではなくdestinationディレクトリを基準にしています。だからあなたが欲しいのは:

rsync -a --link-dest=../`basename $DATA` $DATA $DATA/../upgrade_tmp
7

わたしにはできる:

$ rsync --hard-links --recursive --link-dest=/local user@Host:/remote/ /local

私はrsyncバージョン3.1.0を使用しています。

man から:

-hard-links

転送でハードリンクされたファイルを探すようにrsyncに指示します。このオプションがない場合、転送でハードリンクされたファイルは個別のファイルであるかのように扱われます。

-link-dest = DIR

変更されていないファイルは、DIRから宛先ディレクトリにハードリンクされます。ファイルがリンクされるためには、保存されているすべての属性(権限、場合によっては所有権など)が同じでなければなりません。

4

まず、宛先にのみディレクトリを作成します。

rsync -av --include '*/' --exclude '*' /source/ /destination/

次に、ファイルのみをハードリンクします。

cd /source
find . -type f -exec ln -v {} /destination/{} \;
2
Cakemox

次のリンクを試すことができます http://www.lessfs.com/wordpress/ 作業中です [〜#〜] cow [〜#〜] (書き込み時にコピー)時間とスペースを節約できます

2
Rajat

オプション-Hを使用してハードリンクを保持し、マンページを読みます。

1
tex