これは表現です:
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
キーssh
とrsync
認証が使用されます。
それで、このバックティックは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を使用する代わりにfind
zshをシェルとして使用します。ほとんどのfind
携帯電話と同様に、複数の携帯電話と交換できます。グローバル予選:.
for -type f
、On
数値を並べ替え、[1]
最初の一致のみを保持します。
rsync -avz --progress --no-whole-file somehost/remote/source/dir/**/*.sql(.on[1]) .