rsyncを使用して変更されたファイルを印刷する方法は?


32

実際にファイルを転送することなく、異なるすべてのファイルへの完全なファイルパスを印刷するためにrsyncを取得する方法はありますか?

または、サイズの変更または最終変更時刻のみに基づいて、2つのツリー間で(SSHを介して)ファイルを比較する方法が必要です。

回答:


33

Rsyncにはdry-runオプションがあります:

-n, --dry-run               show what would have been transferred

これがあなたが望むものかどうかはわかりません。

あなたがしたい場合はdiff2つのツリー間でのファイル、あなたは多分、再帰的に両方のファイルへのLSとパイプへの出力を見つけるとパイプを持つ2つの方向を検索することができます。その後diff、ファイルの比較に使用できます。


3
+1、これはrsyncに組み込まれています。の出力の詳細はandの--dry-run使用に依存します。したがって、出力がまったく得られない場合は、必要に応じてこれらのオプションを設定します。ファイルが変更されていない場合でもディレクトリ名を送信することに気づきましたが、出力を渡すなどして、これらを除外できます。-v--progress optionssed
デビッドスピレット

4
しかし、-dry-runはファイルが同一であっても表示するようです。
Quantum7

14

--out-formatを使用して詳細を確認し、それをさらに少なくします。

rsync -azh --dry-run --delete-after --out-format="[%t]:%o:%f:Last Modified %M" source destination | less

7

rsync -rvn localdir targetdir

-nは、アクションのみを表示することを意味します(アクションは実行されません)。

「v」が必要です。そうしないと何も表示されません。(残りの答えはこれを忘れます...)


2
フォロワーの場合、-nは "--dry-run"と同等です:)
rogerdpack

1

他の回答とhttps://serverfault.com/a/618740/114520に基づいて構築する

  • --dry-run(または-n)を使用して変更を回避する
  • --itemize-changes(または-i)を使用して変更を見つける
  • --archive(または-a)を使用してすべてのサブディレクトリを取得します
  • egrepドットで始まるエントリをフィルタリングするために使用します(変更なし)

それはあなたに与えます: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\."

1つの方法だけが必要な場合は、コマンドを変更できます。

  • ソースから宛先への変更の場合: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|<)"
  • 宛先からソースへの変更の場合: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|>)"

ファイルのみが必要な場合は、awk魔法を追加するだけです。rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\." | awk '{print $2}'


0

私はこのようなものに行きます:

#! /bin/bash 

set -eu   ## Stop on errors and on undefined variables

## The local directory name
LOCAL_DIR=$1
## The remote directory in rsync sintax. Example: "machine:directory"
REMOTE_DIR=$2

shift 
shift 
# Now the first two args are gone and any other remaining arguments, if any, 
# can be expanded with $* or $@

# Create temporary file in THIS directory (hopefully in the same disk as $1:
# we need to hard link, which can only made in the same partition)
tmpd="$(mktemp -d  "$PWD/XXXXXXX.tmp" )"

# Upon exit, remove temporary directory, both on error and on success
trap 'rm -rf "$tmpd"' EXIT

# Make a *hard-linked* copy of our repository. It uses very little space 
# and is very quick 
cp -al "$LOCAL_DIR" "$tmpd"

# Copy the files. The final «"$@"» allows us to pass on arguments for rsync 
# from the command line (after the two directories).
rsync -a "$REMOTE_DIR"/   "$tmpd/"  --size-only "$@"

# Compare both trees
meld "$LOCAL_DIR"  "$tmpd"

例えば:

$ cd svn 
$ rsyncmeld myproject othermachine:myproject -v --exclude '*.svn' --exclude build

0

問題の真実は、実行rsync -v ...してファイル名を画面に出力する場合、そのファイル転送されている(または--dry-runを実行している場合は転送されている)ことです。rsyncが転送しようとした理由を確認するには、itemizeモードを使用します:https : //serverfault.com/a/618740/27813

他の人が指摘したように、デフォルトでは、rsyncはファイルサイズとタイムスタンプに基づいて比較するだけです。どのファイルが異なるかを本当に見たい場合は、「-c」チェックサムモードを使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.