当将目录同步src
到 时dest
,有什么方法可以使目录dest
包含按字典顺序排列的最后一个k
子目录,就像在移动窗口中一样,在重新运行时,src
会自动删除掉在窗口之外的子目录。dest
稍后再执行相同的命令?
例如,如果k
= 2,则src
包含
dir_1
dir_2
dir_3
dir_4
dir_5
anddest
为空,运行后rsync
,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
会发生什么。
您也可以使用数组执行此操作bash
,但语法有点混乱。