rsyncを使用して、変更されたファイルのみのリストを作成できますか?


26

bashスクリプトでrsyncを使用して、いくつかのサーバーとNASの間でファイルの同期を維持しています。私が遭遇した問題の1つは、rsync中に変更されたファイルのリストを生成しようとすることです。

考えは、rsyncを実行すると、変更されたファイルをテキストファイルに出力できることです(メモリ内の配列をさらに期待します)。スクリプトが存在する前に、変更されたファイルのみで chownを実行できます。

誰かがそのようなタスクを実行する方法を見つけましたか?

# specify the source directory
source_directory=/Users/jason/Desktop/source

# specify the destination directory
# DO NOT ADD THE SAME DIRECTORY NAME AS RSYNC WILL CREATE IT FOR YOU
destination_directory=/Users/jason/Desktop/destination

# run the rsync command
rsync -avz $source_directory $destination_directory

# grab the changed items and save to an array or temp file?

# loop through and chown each changed file
for changed_item in "${changed_items[@]}"
do
        # chown the file owner and notify the user
        chown -R user:usergroup; echo '!! changed the user and group for:' $changed_item
done

ここで私の答えをご覧ください。また-iitemizeのため、少数のより多くのねじれ...と
フランクNocke

回答:


42

rsyncの--itemize-changes-i)オプションを使用して、次のような解析可能な出力を生成できます。

~ $ rsync src/ dest/ -ai
.d..t.... ./
>f+++++++ newfile
>f..t.... oldfile

~ $ echo 'new stuff' > src/newfile

~ $ !rsync
rsync src/ dest/ -ai
>f.st.... newfile

>最初の位置の文字はファイルが更新されたことを示し、残りの文字は理由st示します。たとえばここでは、ファイルサイズとタイムスタンプが変更されたことを示します。

ファイルリストを取得する手っ取り早い方法は次のとおりです。

rsync -ai src/ dest/ | egrep '^>'

明らかに、より高度な解析により、よりクリーンな出力が生成される可能性があります:-)

いつ--itemize-changes導入されたかを見つけようとしていたときに、この素晴らしいリンクに出会いました。非常に便利です。

http://andreafrancia.it/2010/03/understanding-the-output-of-rsync-itemize-changes.html(アーカイブされたリンク)


2
述べたようにクリーナー出力の場合は、rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-run変更されたファイルのみ(リストし異なるチェックサム)、間違いなくキーパー、THX :) FYI入れて--dry-run使用する代わりに、コマンドの後にn私のためのベストプラクティスであるオプションを
MediaVince

本質的に同じようrsync -zavc src/ dest/ --dry-runのない冗長
MediaVince

14

チェックサムフラグとフラグと-n組み合わせて、フラグを使用します。-c-i

# rsync -naic test/ test-clone/
>fcst...... a.txt
>fcst...... abcde.txt
>fcst...... b.txt

この例では、ファイル自体の内容に基づいて、1つのファイルのみが変更されています。ただし、-nフラグのためにファイルの同期は行われません

ボーナス

変更されたファイルでchownを実行する場合はsed、xargsを使用してそれらを解析し、xargsで処理します。次に例を示します。

rsync -naic test/ test-clone/ | sed 's/............//' | xargs -I+ sudo chown root "test-clone/+"

3
sed->cut -d ' ' -f2,-
MUYベルギー

-n --dry-run-c --checksum-i --itemize-changes
ThorSummoner

私はフォローしていません。この例のこれらのファイルはすべて「> fcst」とマークされていますが、これは「リモートから受信される」、チェックサムが異なる、サイズが異なる、時間が異なるという意味です。出力では、「1つのファイルのみが変更された」ことを示していますか?
ボブポール

1

この質問は少し古いですが、追加する価値があると思います。

-i のショートカットです --out-format=%i%n%L

そして、%n手段、ファイル名、(セクションlog formatman rsyncd.conf

PS rsyncバージョン3.1.0


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