Rsync는 마지막 k 하위 디렉터리의 창을 이동합니다.

Rsync는 마지막 k 하위 디렉터리의 창을 이동합니다.

디렉토리를 src에 동기화할 때 움직이는 창처럼 dest디렉토리에 사전순으로 dest마지막 하위 디렉토리가 포함 되도록 하여 다시 실행 시 창 외부에 있는 하위 디렉토리가 자동으로 제거되도록 하는 방법이 있습니까? 나중에 동일한 명령을 실행하시겠습니까?ksrcdest

예를 들어, k= 2이면 다음을 src포함합니다 .

dir_1
dir_2
dir_3
dir_4
dir_5

dest을 실행한 후에 는 rsyncsum 을 dest포함해야 합니다 . 나중에 내용이 포함되면dir_4dir_5src

dir_1
dir_2
dir_3
dir_4
dir_5
dir_6

다시 실행 하면 rsync(완전히 동일한 명령줄을 사용하여) dir_4에서 제거 dest하고 dir_6.

답변1

예, 가능합니다.

일방 /bin/sh통행:

#!/bin/sh

# number of entries to sync
k=2

# generate file list (sets $1, $2, $3 etc., collectively known as $@)
set -- src/*

# shift off all but the last $k of these entries
shift "$(( $# - k ))"

# create include patterns ($entry is not actually used,
# we work on the 1st element and then add it to the end and shift)
for entry do
    set -- "$@" --include="${1##*/}/***"
    shift
done

# run rsync
rsync --verbose --archive --delete --delete-excluded "$@" --exclude='*' src/ dest/

$@이는 먼저 파일 목록을 생성한 다음 set(glob처럼 사전순으로 정렬) 마지막 파일을 제외한 모든 항목을 삭제합니다 $k. 루프는 각각을 src/element로 변환합니다 --include=element/***. 이 포함 패턴은 rsync지정된 이름 element과 그 아래의 모든 항목을 고려합니다. 이러한 포함 패턴은 rsync명령줄에서 사용되며 --exclude='*'명시적으로 포함되지 않은 모든 항목을 제외합니다(첫 번째 일치 항목이 중요함).

rsync이를 실행하면 --delete소스 디렉터리에서 사용할 수 없는 대상의 포함된 하위 디렉터리에 있는 모든 항목이 제거되고 --delete-excluded제외된 항목도 제거됩니다.

스크립트를 실행하고 sh -x무슨 일이 일어나는지 확인하세요.

array 를 사용하여 이 작업을 수행할 수도 있지만 bash구문이 약간 혼란스럽습니다.

관련 정보