いくつかのサーバーとNASの間でファイルの同期を保つために、bashスクリプトでrsyncを使用しています。私が遭遇した1つの問題は、rsync中にから変更されたファイルのリストを生成しようとすることです。
アイデアは、rsyncを実行すると、テキストファイルに変更されたファイルを出力できる-メモリ内の配列を期待する-スクリプトが存在する前にonlyで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
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
最初の位置の>
文字はファイルが更新されたことを示し、残りの文字は理由を示します。たとえば、ここでs
およびt
はファイルサイズとタイムスタンプが変更されたことを示します。
ファイルリストを取得するための迅速で汚れた方法は次のとおりです。
rsync -ai src/ dest/ | egrep '^>'
明らかに、より高度な解析がよりきれいな出力を生成する可能性があります:-)
--itemize-changes
がいつ導入されたかを調べようとしているときに、この素晴らしいリンクに出会いました。非常に便利です。
http://andreafrancia.it/2010/03/understanding-the-output-of-rsync-itemize-changes.html (アーカイブされたリンク)
-n
フラグを-c
チェックサムフラグと-i
フラグと組み合わせて使用します。
# rsync -naic test/ test-clone/
>fcst...... a.txt
>fcst...... abcde.txt
>fcst...... b.txt
この例では、ファイル自体の内容(チェックサムによって決定される)に基づいて、3つのファイルが変更されています。ただし、-n
フラグのため、ファイルの同期は行われません
ボーナス
変更されたファイルに対してchownを実行する場合は、sed
または類似のものを使用してファイルを解析し、xargsを使用して処理します。次に例を示します。
rsync -naic test/ test-clone/ | sed 's/............//' | xargs -I+ Sudo chown root "test-clone/+"
この質問は少し古いですが、追加する価値があると思います:
-i
は--out-format=%i%n%L
のショートカットです
そして%n
はファイル名を意味します(log format
のセクションman rsyncd.conf
)
追伸rsyncバージョン3.1.0