rsyncがここで最新のディレクトリを無視するのはなぜですか?

rsyncがここで最新のディレクトリを無視するのはなぜですか?

多くのサブディレクトリを持つ2つのディレクトリがあります。ディレクトリを比較し、2番目のディレクトリに欠けているサブディレクトリと1番目のディレクトリで最新のサブディレクトリを見つけたいと思います。方法を見つけるためにテストディレクトリを作成しました。最初のものは次のとおりです。

name@pc:~/test> ls -l dir1/
insgesamt 28
drwxrws--- 2 name 1111111 4096 12. Jan 10:53 testdir1
drwxrws--- 2 name 1111111 4096 12. Jan 10:53 testdir2
drwxrws--- 2 name 1111111 4096 12. Jan 10:53 testdir3
drwxrws--- 2 name 1111111 4096 12. Jan 10:53 testdir4
drwxrws--- 2 name 1111111 4096 12. Jan 10:53 testdir5
drwxrws--- 2 name 1111111 4096 12. Jan 10:53 testdir6
drwxrws--- 2 name 1111111 4096 12. Jan 11:35 testdir7

2番目は次のとおりです。

name@pc:~/test> ls -l dir2/
insgesamt 20
drwxrws--- 2 name 1111111 4096 12. Jan 11:19 testdir1
drwxrws--- 2 name 1111111 4096 12. Jan 11:19 testdir2
drwxrws--- 2 name 1111111 4096 12. Jan 11:19 testdir3
drwxrws--- 2 name 1111111 4096 12. Jan 11:19 testdir4
drwxrws--- 2 name 1111111 4096 12. Jan 10:53 testdir7

ご覧のとおり、testdir5とtestdir6は2番目のディレクトリにはなく、testdir7は最新ではありません(最初のディレクトリにあるより古い)。これら3つのディレクトリ(testdir5、testdir6、testdir7)が望ましい出力です。また、サブディレクトリは変換プロセスの前後にあるため、両方のディレクトリに同じファイル/コンテンツが含まれていません。したがって、rsyncで-rオプションを使用することは適用されないと思います。次のコマンドは、ディレクトリの違い(欠落または古い)を提供する必要があります。

name@pc:~/test> rsync --update -dvn dir1/ dir2/
building file list ... done
testdir5/
testdir6/

sent 164 bytes  received 18 bytes  364.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

-d ディレクトリオプション。 -vリスト出力用。 -n 違いだけに興味があるからです。とにかく--updateオプションには違いはありません。ここでtestdir7 /を取得できないのはなぜですか?明らかに、ディレクトリ修正日はそれがより古いことを示しています。私はこれがrsyncが何か違うかどうかを判断する方法とこれが単なるディレクトリであるという事実に関連していると思います。しかし、私が知っている限り、「修正時間のみを使う」オプションはありません。ここでどう違うのですか?

編集:いくつかの答えをテストした後の結果

name@pc:~/test> rsync -dnvt dir1/ dir2/
building file list ... done
./
testdir1/
testdir2/
testdir3/
testdir4/
testdir5/
testdir6/
testdir7/
testdir8/

sent 206 bytes  received 43 bytes  498.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

name@pc:~/test> rsync -dnvt --ignore-existing dir1/ dir2/
building file list ... done
./
testdir1/
testdir2/
testdir3/
testdir4/
testdir5/
testdir6/
testdir7/
testdir8/

sent 206 bytes  received 43 bytes  498.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

name@pc:~/test> rsync -dnvt --update dir1/ dir2/
building file list ... done
./
testdir1/
testdir2/
testdir3/
testdir4/
testdir5/
testdir6/
testdir7/
testdir8/

sent 206 bytes  received 43 bytes  498.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

name@pc:~/test> rsync -anv --ignore-existing dir1/ dir2
sending incremental file list
./
testdir1/
testdir2/
testdir3/
testdir4/
testdir5/
testdir6/
testdir7/
testdir7/testfile1.txt
testdir8/

sent 300 bytes  received 54 bytes  708.00 bytes/sec
total size is 9  speedup is 0.03 (DRY RUN)

ベストアンサー1

rsyncにディレクトリを参照するように要求するのではなく、ディレクトリ内のファイルではなくディレクトリ自体を同期するだけです。 rsync がディレクトリ内のファイルを考慮するようにするには、オプションを渡す-rか、-aコマンドラインにファイルを一覧表示する必要があります。

rsyncにメタデータのコピーを要求していません。デフォルトでは、rsyncはコンテンツのみをコピーします。ディレクトリにはコンテンツがなく、ディレクトリ自体のみが存在します。ディレクトリ内のコンテンツ(その中のファイル)は、個別にコピーでき、フィルタの影響を受ける可能性がある別々のオブジェクトとして扱われます。ターゲットツリーにはすでに存在するため、testdir7これに対して何もする必要はありません。ディレクトリのタイムスタンプをコピーするか、-tオプションを渡す必要があります-a

ディレクトリ内のファイルをコピーせずにディレクトリのタイムスタンプをコピーすることはほとんど役に立ちません。ディレクトリにファイルを作成(または削除など)すると、そのディレクトリの変更時間が更新されます。一方、既存のファイルを変更したりディレクトリを変更しても、ディレクトリの変更時間は更新されません。更新dir2/testdir7修正時間とそれからdir1/testdir7から にファイルをコピーすると、dir2/testdir7の修正時間はdir2/testdir7ファイルがコピーされた時間になります。 Rsyncは、ディレクトリのタイムスタンプに基づいてディレクトリのコンテンツをコピーすることを決定しません。これは、ディレクトリコンテンツの状態に関する情報を提供しないためです。

おすすめ記事