出力を理解しようとしていますrsync -n --update -av dir1/ dir2/
。ここには、dir2
存在しないか最新のファイルだけでなく、すべてのディレクトリをリストする必要があると聞きましたdir1
。テストディレクトリでこれを試しました。
test
test/testDir1
test/testDir1/testDir11
test/testDir1/testDir11/testFile3.txt
test/testDir1/testFile2.txt
test/testFile1.txt
test/testDir2
にコピーしてtestCopy
変更してtest/testDir1/testFile2.txt
実行すると、rsync -n --update -av test/ testCopy/
出力は次のようになります。
./
testDir1/
testDir1/testFile2.txt
testDir1/testDir11/
testDir2/
出力がどのように機能するかは、内容に基づいてこれが私が期待するものです。
しかし、、他のより大きな物理ディレクトリのペアに対して同じコマンドを試しましたが、非常に異なる動作を得ました。以下は、同期する必要があるディレクトリペアの2つの例です。
./
場合によっては、ディレクトリ620とファイルが多いが出力は。リストされたファイルはありません。一方、いくつかの(7/72)ディレクトリがリストされています。リストされたファイルはありません。
この出力が私に何を示しているのか理解できませんか?
答え1
指摘できる明確な文書はありませんが、これが起こっていると思います。
を使用すると、-v|--verbose
転送するファイル(-n|--dry-run
指定した場合は転送するファイル)が一覧表示されます。ディレクトリは Unix 系オペレーティング・システムの単純なファイルであり、同じ規則に従ってリストされます。
では、ディレクトリはいつ移行されますか? (明らかにターゲットに存在しない場合を除き)これを指定すると仮定すると-t|--times
(暗黙的に-a
)タイムスタンプが変更されたときに送信されます。プロパティが変更されると、同様のルールが適用されます。
ディレクトリのタイムスタンプはいつ変更されますか?観察によると、これは(少なくとも)ファイルが単に属性(時間など)を変更するのではなく、ディレクトリ内のファイルが作成されたり名前が変更されたりすることです。
したがって、touch
で新しいファイルを作成するtestDir11
と、testDir11
タイムスタンプが変更され、転送が可能になります。ただし、既存のファイルが存在する場合、touch
ディレクトリは変更されません。
答え2
ポイント:
コピー(コマンド
cp
)はrsyncとは異なる操作を行います。まず、タイムスタンプをコピーしません。この
rsync
オプションは--update
最新のファイルのみを更新します。
あなたがやっていることがディレクトリのコピーであると仮定すると、具体的には次のようになります。
#!/bin/bash
mkdir -p test/testDir2
mkdir -p test/testDir1/testDir11
echo "yes3" > test/testDir1/testDir11/testFile3.txt
echo "yes2" > test/testDir1/testFile2.txt
echo "yes1" > test/testFile1.txt
sleep 3
cp -r test/ testcopy/
これにより、同様の構造を持つ2つのディレクトリが作成されます。
$ tree test
test
├── testDir1
│ ├── testDir11
│ │ └── testFile3.txt
│ └── testFile2.txt
├── testDir2
└── testFile1.txt
そして、以下をコピーしてください。
$ tree testCopy/
testCopy/
├── testDir1
│ ├── testDir11
│ │ └── testFile3.txt
│ └── testFile2.txt
├── testDir2
└── testFile1.txt
これらのディレクトリは同じように見えますが、そうではありません。前sleep 3
のコマンドはcp
すべてのファイルの時間を異なりますtestCopy
。
$ ls -la --time-style=full-iso test/testFile1.txt
-rw-r--r-- 1 user user 5 2017-06-22 20:22:13.704512555 0000 test/testFile1.txt
$ ls -la --time-style=full-iso testCopy/testFile1.txt
-rw-r--r-- 1 user user 5 2017-06-22 20:22:16.716355225 0000 testCopy/testFile1.txt
次に、指定したオプション(何も変更しない)を使用してrsyncをテストすると、次のようになります。
$ rsync -n --update -va test/ testCopy/
sending incremental file list
./
testDir1/
testDir1/testDir11/
testDir2/
なぜこれが起こるのですか?
この--update
オプションは優先的に適用され、同期のみが実行されるため新しい文書。コピー内のファイルは、元のファイルよりも最新のバージョンです。
元のディレクトリにあるファイルをタッチすると、そのファイルが含まれます。
$ touch test/testFile1.txt
$ rsync -n --update -va test/ testCopy/
sending incremental file list
./
testFile1.txt
testDir1/
testDir1/testDir11/
testDir2/
完全に同期された(古いまたは最新ですが、他の)コンテンツは次のとおりです。
$ rsync -n -va test/ testCopy/
sending incremental file list
./
testFile1.txt
testDir1/
testDir1/testFile2.txt
testDir1/testDir11/
testDir1/testDir11/testFile3.txt
testDir2/
同期が許可されている場合(オプションの削除-n
)、もう一度実行してください。
$ rsync -n -va test/ testCopy/
sending incremental file list
すべてが更新されたため、交換する必要はありません。
ファイルが変更されると(最新のまま)、更新されます。
$ touch test/testDir1/testFile2.txt
$ rsync -n --update -va test/ testCopy/
sending incremental file list
testDir1/testFile2.txt
ただし、実際の同期後、更新されたファイルがコピー内のファイルである場合。そうだろういいえ交換が必要です(すでに新製品です)。
$ touch testCopy/testDir1/testFile2.txt
$ rsync -n --update -va test/ testCopy/
sending incremental file list