Esse comando resume-se a isto:
rsync --delete --recursive /etc/logrotate.d/{httpd,mariadb,php-fpm,ppp,wpa_supplicant,yum} [email protected]:/etc
O .
tem seu significado literal - é parte do nome - então esse não é o problema. A parte em {}
está sujeita à expansão de chaves : cada uma separada por vírgulas parte é expandida e concatenada à parte do argumento que veio antes ( /etc/logrotate.d/
). (Também ganharia algo depois, se houvesse algo: a{BC}d
se expande para aBd aCd
).
Portanto, este comando é equivalente a
rsync --delete --recursive /etc/logrotate.d/httpd /etc/logrotate.d/mariadb /etc/logrotate.d/php-fpm /etc/logrotate.d/ppp /etc/logrotate.d/wpa_supplicant /etc/logrotate.d/yum [email protected]:/etc
ou para escolher apenas um diretório, por isso é curto:
rsync --delete --recursive /etc/logrotate.d/httpd [email protected]:/etc
O rsync interpreta o local "de" como uma entidade única e, se não terminar com /
, cria um novo arquivo ou diretório com apenas a última parte desse nome dentro o caminho de destino indicado: aqui, isso é httpd
. Então, isso faz um /etc/httpd
no destino e copia o conteúdo de /etc/logrotate.d/httpd
para ele.
Com --delete
, será excluir tudo que não foi em /etc/logrotate.d/httpd
na origem. O problema - como /etc/logrotate.d/httpd
provavelmente não existe, copiá-lo e excluir todos os arquivos que não estavam presentes na origem significa excluir tudo em todos esses diretórios . Se ele existisse, seu conteúdo não seria o mesmo que /etc/httpd
, então (quase) tudo seria deletado.
Portanto, o problema é que você tem a parte logrotate.d
, quando realmente queria copiar os mesmos diretórios em /etc
. O que você provavelmente quis dizer foi apenas:
rsync --progress --delete -avhHe ssh /etc/{httpd,mariadb,php-fpm,ppp,wpa_supplicant,yum} [email protected]:/etc
Isso copia /etc/httpd
e seu conteúdo para /etc/httpd
no destino e assim por diante. Se você quisesse copiar as coisas dentro de logrotate.d
, coloque isso no caminho dos dois lados.
Uma coisa que você pode achar útil é a -n
ou --dry-run
opção para rsync
:
-n, --dry-run perform a trial run with no changes made
Isso mostrará uma prévia do que aconteceria, mas não fará alterações nos dois lados. Você pode usar isso para verificar o que você quer antes de executar a coisa real.
Você perguntou como evitar a expansão do shell nos argumentos que você deu a rsync
. Como acima, eu não acho que é realmente o que você quer dado o problema que você teve, mas se você precisar: expansões de chaves não ocorrem dentro de aspas, então "a{BC}d"
fica como a{BC}d
literalmente.