versions/
rsyncデーモンとftpを介してのみアクセスできるリモートサーバーにディレクトリがあります。このディレクトリには、コードベースがデプロイされた日時などの名前の付いた一連のサブディレクトリが含まれていversions/20150101000000/
ますversions/20150102120000/
。以前のバージョンを自動的に削除する必要がありますが、空のソースディレクトリを使用するrsyncがftpを使用して再帰的に繰り返すよりもはるかに高速だと思います。 (簡単なタスクを実行するために使用できるftpのSITE EXECがないことを確認しましたrm -rf versions/$version/
。)
最初のrsync --list-only
コマンドを使用してバージョンリストを解析してソートし、(rsyncが常に期待される順序でリストを返さないという証拠を見ました)、最新の3つのバージョンを除くすべてのバージョンを削除することを選択しました。
特定のディレクトリを消去するコマンドは簡単です。
rsync -vr --delete `mktemp -d`/ rsync://user@host:123/module/versions/$version/
ただし、rsyncで予想されるように、最上位ディレクトリ自体は削除されません。同期しているディレクトリとその内容の削除を要求する方法はrsyncにありますか?それ以外の場合は、//パラメータのいくつかの組み合わせを使用して親ディレクトリに対して同期を実行することが可能でなければならないと思いますversions/
が、生涯にわたってそれを理解することはできません。--exclude
--include
--filter
私は同様のことを試しました:
rsync -vr --delete --include=/20150101000000/ rsync://user@host:123/module/versions/
スラッシュの有無にかかわらず、引数の--exclude='*'
前または後にリストされるとき--include
、--delete-excluded
一致--include
および--exclude
引数に必要なときに使用されます。私が望む結果を得ることができるものは何もないようです。
内容をrsyncしてrmdir
空のディレクトリでftpを使って作業を完了することもできましたが、rsyncだけを使ってこれを行うことができることに気付き、解決策を見つけたいと思います。ありがとうございます!
答え1
こだわりが良いです。次の作業中に停止し、代わりにローカルファイルでテストしましたrsync://
。これを行わない場合は -n を使用し、実行される理由は -iv を使用します。 empty
ローカルの空のディレクトリです。削除するリモート ディレクトリ 20150101000000 も空である必要があります。
rsync -nivd --delete --filter='-! /20150101000000' empty/ rsync://user@host:123/module/versions/
答え2
フレンドリーなIRC担当者のおかげで、単一のrsync
コマンドを使用して特定のディレクトリを削除する効果的なソリューションを見つけました。--include
ディレクトリ内容の引数(--include '/20150101000000/**'
)、--include
ディレクトリ自体の別の引数(--include '/20150101000000/'
)を指定し、--exclude '*'
最上位ディレクトリの他のすべてのコンテンツを無視するように動作します(この場合versions/
)。
rsync -vr --delete --include '/20150101000000/**' --include '/20150101000000/' --exclude '*' `mktemp -d`/ rsync://user@host:123/module/versions/
次に、上記の内容を完全に理解するために、マニュアルページを掘り下げて、次の便利なセクションを見つけました。
末尾の "dir_name/***" は、ディレクトリ ("dir_name/" が指定されているかのように) とディレクトリ内のすべてのエントリ ("dir_name/**" が指定されたかのように) の両方と一致します。この動作はバージョン2.6.7に追加されました。
この情報を使用すると、これを単一のパラメータに減らすことができます--include
。
rsync -vr --delete --include '/20150101000000/***' --exclude '*' `mktemp -d`/ rsync://user@host:123/module/versions/