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混乱しています。

関連情報