Bash

如何從 rsync 輸出已更改文件的列表?

  • June 13, 2020

我在 bash 腳本中使用 rsync 來保持文件在一些伺服器和 NAS 之間同步。我遇到的一個問題是嘗試生成在 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

您可以使用 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(存檔連結)

引用自:https://serverfault.com/questions/618735