rsync를 사용하여 변경된 파일 만 목록으로 만들 수 있습니까?


26

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

여기에 내 대답을 참조 하십시오 . 또한 -i항목별로 분류하지만 약간의 왜곡이 있습니다.
Frank 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

>첫 번째 위치에있는 문자가 파일이 업데이트되었음을 나타냅니다, 나머지 문자는 왜, 예를 들어 여기에 표시 s하고 t, 파일 크기와 타임 스탬프가 변경된 것을 나타냅니다.

파일 목록을 얻는 빠르고 더러운 방법은 다음과 같습니다.

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 :) 참고 퍼팅 --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

이 예에서는 파일 자체의 내용에 따라 하나의 파일 만 변경되었습니다. 그러나 -n플래그로 인해 파일 동기화가 수행되지 않습니다

보너스

변경된 파일에서 chown을 실행하려면 파일을 구문 분석 sed하거나 유사하게하고 xargs로 처리하십시오. 예를 들면 다음과 같습니다.

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

3
sed->cut -d ' ' -f2,-
MUY Belgium

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

나는 따르고 있지 않다. 예제의 3 가지 파일 모두 '> fcst'로 표시되어있어 '원격에서 수신된다'는 것을 의미합니다. 체크섬이 다르고 크기가 다르며 시간이 다릅니다. 출력에서 "하나의 파일 만 변경되었다"는 내용은 무엇입니까 ??
bobpaul

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.