私は見たことがないこれ(そしてフォーラムトピックここ)とこれ。
私はコマンドラインで実行するだけでなく、Pythonでも実行してみました。もう一度確認しました。一部のファイルは実際にソースから削除されましたが、link-dest
ターゲットには存在します。私はいくつかのオプションを試しました。パスの末尾にスラッシュを追加して違いがあるかどうかを確認しようとしました。すべての場合のパスは単純なディレクトリであり、グローバルパターンで終わるわけではありません。マンページも確認してみました。
しかし、これは重要ではありませんが、あなたは知りません。私はこれをWSL(W10 OS)で実行しています。
何も動作しないようです。
しかし、ソースから削除されたファイルはするテスト実行でない場合、ターゲットの場所から削除またはコピーされません。
私がしたいことは、link-dest
変更がない場合は、ジョブをキャンセルするために場所とソースの間で変更されたものを見つけることです。ただし、これを行うには、新しいファイルや変更されたファイル、および削除されたファイルのリストを取得できる必要があります。
私が試したPythonコードは次のとおりです。
link_dest_setting = '' if most_recent_snapshot_of_any_type == None \
else f'--link-dest={most_recent_snapshot_of_any_type[0]}'
rsync_command_args = [ 'rsync',
'-v',
# '--progress',
# '--update',
'--recursive',
'--times',
'--delete',
# '--info=DEL',
'-n',
link_dest_setting, source_dir, new_snapshot_path, ]
print( f'running this: {rsync_command_args}')
result = subprocess.run( rsync_command_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
rsync_result_stdout = result.stdout.decode( 'utf-8' )
print( f'rsync_result stdout |{rsync_result_stdout}|')
rsync_result_stderr = result.stderr.decode( 'utf-8' )
print( f'rsync_result stderr |{rsync_result_stderr}|')
一般stdout
(試験実行):
rsync_result stdout |sending incremental file list
./
MyModifiedFile.odt
sent 1,872 bytes received 25 bytes 3,794.00 bytes/sec
total size is 6,311,822 speedup is 3,327.27 (DRY RUN)
|
(報告されたエラーなしstderr
)
私は別のオプションを見つけました。-i
このオプションを使用すると、本当に不思議になります。
rsync_result stdout |sending incremental file list
.d..t...... ./
>f.st...... MyModifiedFile.odt
sent 53,311 bytes received 133 bytes 35,629.33 bytes/sec
total size is 6,311,822 speedup is 118.10
|
編集する
一般的なBASHコマンド:
rsync -virtn --delete --link-dest=/mnt/f/link_dest_dir /mnt/d/source_dir /mnt/f/destination_dir
原則として、テスト実行ではlink_dest_dirの下に存在するファイル/ディレクトリを表示する必要がありますが、source_dirの下には存在しない(削除された)ファイル/ディレクトリを表示する必要があります。これを表示できません。とにかく、Pythonの答えがより良い解決策であると思います。違いを初めて検出するとスキャンが停止するためです。
編集2
(roaimaの質問「何を保存していますか?」への回答)
私の「マイドキュメント」ディレクトリは約6GBで、何千ものファイルがあります。違いが見つからない場合は、私のPythonスクリプトをスキャンするのに約15秒かかります(違いがある場合は短い)。rsync
コピーの完了には通常約2分かかります(ほとんどのファイルにハードリンクを使用)。ソースと場所の間に変更がないため、これが不要であることが判明した場合は、link-dest
そのファイルとハードリンクの両方を削除する必要があります。削除操作自体は時間の点で非常に高価です。ちなみにこれは外付け型HD回転ボードタイプです。最も遅い保管場所ではありませんが、制限があります。
また、重要なのはrsync
ソースから削除されたファイルを報告する方法がないようですlink-dest
。これらのスナップショットの場所では、限られた数(たとえば5つ)のスナップショットだけを維持したいが、古いスナップショットと異なる場合にのみ新しいスナップショットを追加したいと思います。したがって、スクリプトが10分ごとに実行されても、隣接するスナップショット間の間隔は40分以上になる可能性があります。
あなた(roaima)は評判が良く、に属しているようです。私が答えたい簡単な質問は:テスト実行時に削除に関連するソースのファイル/ディレクトリを報告rsync
できますか?そうでなければ、これはバグ/欠陥ですか?マニュアルページでは、これが起こらなければならないと主張しているようです(例:)。rsync
link-dest
--info=DEL
答え1
あなたの質問の重要な部分は次のとおりです。
古いスナップショットと異なる場合にのみ、新しいスナップショットを追加したいと思います。したがって、スクリプトは10分ごとに実行できますが、隣接するスナップショット間の間隔は40分以上にすることができます。
そして
rsyncは、練習の実行時にリンク先に関してソースから削除されたファイルまたはディレクトリを報告できますか?
ここで私が理解したことは、あなたがバージョンを実装し、rsnapshot
バックアップを検討するたびにより早いバックアップディレクトリがユーザー--link-dest
ディレクトリになります。主な違いは、現在のソースツリーと最新のバックアップの間に変更がなければ、その場合はバックアップが必要ないことです。
私の簡単な実験では、単に出力を見ることが可能に見えましたrsync
。出力がある場合は操作を実行する必要があり、そうでなければ操作はありません。重要なのは、リンクされたディレクトリを直接見ることです。
output=$(rsync -rti --delete --dry-run "$src/" "$lnk/" 2>&1 | grep -v '^[^*]d' | head -n1)
if [ -n "$output" ]
then
# Work to be done
rsync -rtiv --link-dest "$lnk/" "$src/" "$dst"
fi
現在のテストではディレクトリが省略されているため、ディレクトリを変更してもバックアップは実行されません。ディレクトリの変更にも興味がある場合は、grep
テストからフィルタを削除してください。
答え2
これはPythonを使用しているため、回避策です。私は一日のほとんどをdiff
両方の方法を試してみました。ソースから削除され、その場所(テストの実行など)に存在するファイル/ディレクトリを報告rsync
できません。タスクを実行しているように見えますが、大きなディレクトリの場合は非常に冗長になる可能性があり、「違いが見つかった場合は停止」とは言えません。この問題にも同じことが当てはまります。rsync
link-dest
diff
rsync
import filecmp
def same_folders(dcmp):
if dcmp.diff_files or dcmp.left_only or dcmp.right_only:
return False
for sub_dcmp in dcmp.subdirs.values():
if not same_folders(sub_dcmp):
return False
return True
if same_folders(filecmp.dircmp( source_dir, link_dest_dir_path )):
print( 'NO CHANGE' )
# ... act accordingly
最初の実験では、これが2つのディレクトリ間の違いを見つける簡単な方法であることを示しているようです。ところで、生成に使用するdiff関数dircmp.diff_files
(パスは同じですが、他のファイルのリスト)を調べませんでした。
left_only
ソースで新しいファイル/ディレクトリを検索するか、right_only
ソースから削除されたファイル/ディレクトリをそれぞれ検索します。
違いが見つかった瞬間、明らかに中断されます。
私はバッシュを知っていますたくさんPythonより少ない...上記と同じBASHが可能かどうか疑問に思います。では、スピード比較をしてみるのも面白そうです。