Rsync - опция удаления не удаляет файлы в целевом каталоге

9

Я пытаюсь использовать параметр --delete в rsync для удаления файлов в целевом каталоге, которых нет в исходном каталоге

Вот команда, которую я использую:

rsync -avz --ignore-existing --recursive --delete /var/www/* [email protected]:/var/www

Итак, мой вопрос: как я могу удалить все файлы в целевом каталоге, которых нет в исходном каталоге?

    
задан user2028856 16.04.2015 в 11:15
источник

2 ответа

10

Используйте эту команду:

rsync -avz --ignore-existing --recursive --delete /var/www/ [email protected]:/var/www

Вам не нужно «*» и не следует использовать его.

Чтобы исключить / включить файлы или каталоги, вы должны использовать следующие параметры:

--exclude 'to_exclude*'
--include 'to_include*'
    
ответ дан A.B. 16.04.2015 в 11:18
источник
12

Ваша команда не работала, потому что, когда вы использовали /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/ [email protected]:/var/www/
    
ответ дан heemayl 16.04.2015 в 12:17