Ваша команда не працює, тому що, коли ви використовували /var/www/*
як джерело, ваша оболонка виконує глобалізацію на ній, тобто оболонка розширюється *
до всіх файлів у цьому каталозі та копіює файли по одному, тому тут окремі файли стали джерелами, а не батьківський каталог.
Отже, якщо ви використовуєте /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/