rsync
の--delete
オプションを使用して、元のディレクトリに存在しないターゲットディレクトリのファイルを削除しようとしています。
私が使用しているコマンドは次のとおりです。
rsync -avz --ignore-existing --recursive --delete /var/www/* [email protected]:/var/www
だから私の質問は、元のディレクトリに存在しないターゲットディレクトリ内のすべてのファイルを削除するにはどうすればよいですか?
次のコマンドを使用します。
rsync --archive --verbose --compress --ignore-existing --delete /var/www/ [email protected]:/var/www
「*」は必要ないので、使用しないでください。
ファイルまたはディレクトリを除外/含めるには、次のパラメータを使用する必要があります。
--exclude 'to_exclude*'
--include 'to_include*'
ソースとして/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/ [email protected]:/var/www/