/etc
rsyncを実行したときにシェル拡張を処理しなかったため、私のフォルダの構成ファイルはすべて混乱しました。
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}d
Expands 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