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