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/