디렉토리를 src
에 동기화할 때 움직이는 창처럼 dest
디렉토리에 사전순으로 dest
마지막 하위 디렉토리가 포함 되도록 하여 다시 실행 시 창 외부에 있는 하위 디렉토리가 자동으로 제거되도록 하는 방법이 있습니까? 나중에 동일한 명령을 실행하시겠습니까?k
src
dest
예를 들어, k
= 2이면 다음을 src
포함합니다 .
dir_1
dir_2
dir_3
dir_4
dir_5
dest
을 실행한 후에 는 rsync
sum 을 dest
포함해야 합니다 . 나중에 내용이 포함되면dir_4
dir_5
src
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
구문이 약간 혼란스럽습니다.