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

文字通りの意味があります.。名前の一部なので問題ありません。{}部分の支柱の拡張:コンマで区切られた各部分を展開して、対応するパラメータの前の部分(/etc/logrotate.d/)にリンクします。 (また何でも得れば何でも得ます: a{BC}dExpands aBd 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

または、ディレクトリを選択して短くします。

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

rsync は「from」位置を単一のエンティティとして解釈します。いいえaで終わると、/指定された宛先パスにその名前の最後の部分のみを含む新しいファイルまたはディレクトリが作成されます。つまり、httpdターゲット/etc/httpdにaが作成され、その内容がコピーされます/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

関連情報