Rsync --deleteオプションはターゲットディレクトリのファイルを削除しません


14

私は--deleteオプションを使用rsyncして、元のディレクトリには存在しないターゲットディレクトリのファイルを削除しようとしています

私が使用しているコマンドは次のとおりです。

rsync -avz --ignore-existing --recursive --delete /var/www/* root@mydomaintest.com:/var/www

だから私の質問は、元のディレクトリに存在しないターゲットディレクトリ内のすべてのファイルを削除するにはどうすればよいですか?

回答:


14

次のコマンドを使用します。

rsync --archive --verbose --compress --ignore-existing --delete /var/www/ root@mydomaintest.com:/var/www

「*」は必要ないので、使用しないでください。

ファイルまたはディレクトリを除外/含めるには、次のパラメータを使用する必要があります。

--exclude 'to_exclude*'
--include 'to_include*'

さて、これを試してみましょう:)
user2028856

2
--deleteコマンドが機能しない原因となっている「*」はありますか?
user2028856

2
それがどのように見えるかです。:)
AB

3
--recursiveオプションが-aすでに含まれているため、豊富です
-Temak

1
「*」は、「。」で始まるファイル/ディレクトリを除外するため、重要な場合があります。たとえば、rsyncを使用して、gitで管理されているディレクトリを開発マシンから本番マシンにコピーするときに使用します。.gitリポジトリディレクトリや.gitignoreなどのファイルを同期したくありません。トップレベルのファイルとサブディレクトリを含む作業ツリーだけを同期します。
sootsnoot

14

/var/www/*ソースとして使用しているときにシェルがグロビングを実行しているため、コマンドが機能していませんでした。つまり、シェルは*そのディレクトリ内のすべてのファイルに展開し、ファイルを1つずつコピーするため、個々のファイルがソースではなくソースになりました親ディレクトリ。

そのため、を使用する場合、ファイルを含む親ディレクトリではなく、ファイルが(内容を含むディレクトリとともに)コピーされるため、オプション/var/www/*は不要です。同じ理由で動作しません。ソースディレクトリにないファイルを宛先ディレクトリから削除しますが、ファイルをコピーしないため、ファイルは削除されません(予想どおり)。--recursive*--delete--delete

これにより、より明確になります。

/foo$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test


/bar$ ls -l
-rw-rw-r-- 1 user user 0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user 0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user 0 Apr 16 17:56 spam


$ rsync -avz --ignore-existing --recursive --delete 
/foo/* /bar/

+ rsync -avz --ignore-existing --recursive --delete 
/foo/egg /foo/spam /foo/test /bar/

sending incremental file list
test/
test/hello

sent 173 bytes  received 39 bytes  424.00 bytes/sec
total size is 0  speedup is 0.00


/bar$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test

ご覧のとおり、ソースを使用している/foo/*ため、rsync実行されるコマンドは

rsync -avz --ignore-existing --recursive --delete /foo/egg 
/foo/spam /foo/test /bar/

*シェル、それを拡張し、ソース引数として個別にすべてのファイルを作るために、全体ではなくとして、親ディレクトリ作成(そしてあなたも必要ありません--recursive。この場合には)。

したがって、--delete作業を行いたい場合は、次のように実行します。

rsync -avz --ignore-existing --recursive --delete 
/var/www/ root@mydomaintest.com:/var/www/

4
実際の問題を指摘する優れた説明:「*」を使用してソースリストを展開します。
アントニオバルダッツィ16

受け入れられた答えに関する私のコメントで述べたように、*は、「。」で始まるファイルやディレクトリなどを除外するのに役立ちます。ただし、これは、ソースの最上位から削除されたファイルとディレクトリが宛先ディレクトリから削除されないことを意味します。私自身は、最上位ファイルが宛先から適切に削除されるかどうかは気にしません。サブディレクトリ以下のファイルのみが重要です。トップレベルのサブディレクトリを削除することは、追加するよりもはるかに少ないです。そのような場合は、宛先で手動でrm -rを実行したいと思います。
-sootsnoot
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.