rsync --delete は宛先ディレクトリ内のほとんどのファイルを削除しましたが、なぜでしょうか?

rsync --delete は宛先ディレクトリ内のほとんどのファイルを削除しましたが、なぜでしょうか?

/etcrsync の実行中にシェルの拡張を考慮しなかったため、フォルダー内の設定ファイルがすべてめちゃくちゃになってしまいました。

rsync --progress --delete -avhHe ssh /etc/logrotate.d/{httpd,mariadb,php-fpm,ppp,wpa_supplicant,yum} [email protected]:/etc

問題は、logrotate に続く '.' が展開され、その後、などのいくつかのフォルダー/etc/httpdが削除されたことにあると思います。

この間違いから学び、正しく実行したいと思います。ssh を使用して複数のファイルを rsync するときにシェルの拡張を防ぐにはどうすればよいですか?

答え1

そのコマンドは、要約すると次のようになります。

rsync --delete --recursive /etc/logrotate.d/{httpd,mariadb,php-fpm,ppp,wpa_supplicant,yum} [email protected]:/etc

in .thereは文字通りの意味を持ち、名前の一部なので、問題ではありません。inの部分{}ブレース拡張: カンマで区切られた各部分は展開され、その引数の ( ) の前にある部分に連結されます。( :が に展開される/etc/logrotate.d/ものがあれば、その後ろにあるものも取得されます)。a{BC}daBd aCd

このコマンドは、

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

または、短くするために 1 つのディレクトリだけを選択するには、次のようにします。

rsync --delete --recursive /etc/logrotate.d/httpd [email protected]:/etc

rsyncは「from」の場所を単一のエンティティとして解釈し、しないで終わると、/指定された宛先パス内にその名前の最後の部分だけを持つ新しいファイルまたはディレクトリが作成されます。ここでは、それが ですhttpd。つまり、/etc/httpd宛先に が作成され、 のコンテンツが/etc/logrotate.d/httpdその中にコピーされます。

--deleteすると、すべて削除それなかった/etc/logrotate.d/httpdソースに存在しない可能性があるので/etc/logrotate.d/httpd、それをコピーしてソースに存在しないファイルを削除すると、それらのディレクトリ内のすべてを削除する存在する場合、その内容は と同じではない/etc/httpdため、(ほぼ)すべてが削除されます。

つまり、問題は、logrotate.dの下にある同じディレクトリをコピーするつもりだったのに、 の部分がそこに存在することなのです/etc。おそらく、次のことを意図していたのでしょう。

rsync --progress --delete -avhHe ssh /etc/{httpd,mariadb,php-fpm,ppp,wpa_supplicant,yum} [email protected]:/etc

これにより/etc/httpd、 とその内容が/etc/httpdコピー先にコピーされます。 の内部をコピーする場合はlogrotate.d、両側のパスに と入力します。

役に立つかもしれないのは、-nまたは--dry-runオプションrsync

-n, --dry-run 変更を加えずに試運転を実行します

これにより、何が起こるかのプレビューが表示されますが、実際にはどちらの側でも変更は行われません。これを使用して、実際に実行する前に、それが希望どおりかどうかを確認できます。


に渡した引数でシェルの展開を防ぐ方法を尋ねられましたrsync。 上記のように、あなたが抱えていた問題を考えると、それが実際にあなたが望んでいることではないと思いますが、もし必要になった場合は、中括弧の展開は引用符内では行われないので、文字通り"a{BC}d"のままですa{BC}d

関連情報