ディレクトリを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
混乱しています。