rsyncテストの実行がいくつかのディレクトリを一覧表示しますが、他のディレクトリは一覧表示されません。

rsyncテストの実行がいくつかのディレクトリを一覧表示しますが、他のディレクトリは一覧表示されません。

出力を理解しようとしています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

ポイント:

  1. コピー(コマンドcp)はrsyncとは異なる操作を行います。まず、タイムスタンプをコピーしません。

  2. この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

関連情報