Rsync 移动最后 k 个子目录的窗口

Rsync 移动最后 k 个子目录的窗口

当将目录同步src到 时dest,有什么方法可以使目录dest包含按字典顺序排列的最后一个k子目录,就像在移动窗口中一样,在重新运行时,src会自动删除掉在窗口之外的子目录。dest稍后再执行相同的命令?

例如,如果k= 2,则src包含

dir_1
dir_2
dir_3
dir_4
dir_5

anddest为空,运行后rsyncdest应包含dir_4dir_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会发生什么。

您也可以使用数组执行此操作bash,但语法有点混乱。

相关内容