A opção --delete Rsync não exclui arquivos no diretório de destino

10

Estou tentando usar a opção --delete em rsync para excluir arquivos no diretório de destino que não estão presentes no diretório original

Aqui está o comando que estou usando:

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

Então, minha pergunta é: como posso excluir todos os arquivos no diretório de destino que não estão presentes no diretório original?

    
por user2028856 16.04.2015 / 13:15

2 respostas

10

Use este comando:

rsync --archive --verbose --compress --ignore-existing --delete /var/www/ [email protected]:/var/www

Você não precisa de um "*" e não deve usá-lo também.

Para excluir / incluir arquivos ou diretórios, você deve usar estes parâmetros:

--exclude 'to_exclude*'
--include 'to_include*'
    
por A.B. 16.04.2015 / 13:18
12

Seu comando não estava funcionando porque quando você estava usando /var/www/* como a fonte, seu shell está executando globbing, isto é, o shell está expandindo * para todos os arquivos nesse diretório e copiando os arquivos um por um, aqui os arquivos individuais se tornaram as origens em vez do diretório pai.

Portanto, se você usar /var/www/* , não precisará da opção --recursive , pois * fará com que os arquivos sejam copiados (junto com quaisquer diretórios com seus conteúdos), não o diretório pai que contém os arquivos. Devido à mesma razão, --delete não está funcionando, pois --delete removerá os arquivos do diretório diretório que não estão no diretório de origem , mas você está copiando arquivos não é remover arquivos (esperado).

Isso vai deixar você mais claro:

/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

Como você pode ver, eu usei a fonte como /foo/* , portanto o comando rsync sendo executado é

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

com * fazendo shell para expandi-lo e fazer todos os arquivos individualmente como argumentos de origem, não o diretório pai como um todo (e você também não precisa de --recursive neste caso).

Então, se você quiser fazer --delete funcionar, execute-o como:

rsync -avz --ignore-existing --recursive --delete 
/var/www/ [email protected]:/var/www/
    
por heemayl 16.04.2015 / 14:17