以下の厄介なrsync式を単純化する方法についてのアイデアはありますか?

以下の厄介なrsync式を単純化する方法についてのアイデアはありますか?

これは表現です:

rsync -avz --progress -e "ssh -i /where/is/my/id_dsa" [email protected]:`ssh -i /where/is/my/id_dsa  [email protected] "find /remote/source/dir -type f -name '*.sql' | sort -nr | head -1"` .

リモートホストで新しいSQLファイルを見つけます。 所有者存在する/リモート/ソース/ディレクトリユーザーとビベック localhostの現在のディレクトリにコピーされると、/where/is/my/id_dsaキーsshrsync認証が使用されます。

それで、このバックティックはssh -i ...私を怖がらせます。しかし、必要なファイルを見つける他の方法はありません。どのように単純化できますか?

答え1

.ssh/config に次の設定を追加すると、コマンドを簡素化できます。

    .hostをホストします。
        ID ファイル/場所/is/my/id_dsa
        ユーザー Vivek

今コマンドは簡単です

rsync -avz --progress -e "ssh some.host:`ssh some.host "find /remote/source/dir -type f -name '*.sql' | sort -nr | head -1"` .

通常、私は "P"オプションが短い --progress の代わりに --partial --progress を好むので、コマンドは次のようになります。

rsync -avzPe "ssh some.host:`ssh some.host "find /remote/source/dir -type f -name '*.sql' | sort -nr | head -1"` .

以前に転送したすべてのSQLファイルを現在のディレクトリに保持している場合、rsyncは比較操作を実行し、既存のファイルを再送信しないため、転送するファイルを選択する必要はありません。したがって、コマンドを次のようにさらに簡素化できます。

rsync -avzPe "ssh some.host:`ssh some.host "find /remote/source/dir -type f -name '*.sql'"` .

最後に、コマンドでrsyncのフィルタリングルールを使用できます。

rsync -avzP some.host:/remote/source/dir/**/*.sql .

サブディレクトリ構造が削除されるため、上記のコマンドを使用するときは注意してください。まず、--dry-runを使って実行してみてください。また、単一の":"がrsyncに代わりにsshを使用するように自動的に指示するため、-e ssh blahは必要ありません。これがお客様の要件を満たしていない場合はお知らせください。

乾杯!

答え2

まず、エイリアスを追加してSSHコマンドを簡素化できます。~/.ssh/config文書。

Host somehost
HostName some.host
User vivek
IdentityFile /where/is/my/id_dsa

ポイントを言うには、2つのステップを実行する必要があります。まず、コピーするファイルを決定し(リモート側で実行する必要があります)、そのファイルをコピーまたは更新する必要があります。どのファイルがリモートファイルで、どのファイルがローカルファイルであるかを心配する必要がない場合は、簡単です。したがって、リモートファイルシステムをマウントします。sshfs

mkdir somehost
sshfs somehost:/ somehost

これで、ローカルファイルを完全に操作できます。それ以外の場合は、ローカルファイルシステムが高速であると仮定し、増分デルタアルゴリズムを適用するのではなく、常にファイル全体をコピーするため、その--no-whole-fileオプションをに渡す必要があります。rsync

rsync -avz --progress --no-whole-file $(find somehost/remote/source/dir -type f -name '*.sql' | sort -nr | head -1) .

callを使用する代わりにfindzshをシェルとして使用します。ほとんどのfind携帯電話と同様に、複数の携帯電話と交換できます。グローバル予選.for -type fOn数値を並べ替え、[1]最初の一致のみを保持します。

rsync -avz --progress --no-whole-file somehost/remote/source/dir/**/*.sql(.on[1]) .

関連情報