リモートでスキーマの最新の2つのファイルを同期します。

リモートでスキーマの最新の2つのファイルを同期します。

異なる環境にある2つのサーバー間で、特定のスキーマの最新の2つのファイルを同期したいと思います。

drwxrwxr-x 2 transfer transfer          4096 28. Nov 13:05 .
drwxr-xr-x 7 transfer transfer          4096 28. Nov 13:05 ..
-rw-rw-r-- 1 transfer transfer   11151643678 28. Nov 12:46 test_28-11-2023.dmp.gz
-rw-rw-r-- 1 transfer transfer         29789 28. Nov 13:04 test_28-11-2023.log
-rw-r--r-- 1 transfer transfer   10770251760 28. Nov 13:00 test_anonym_19-11-2023.dmp.gz
-rw-r--r-- 1 transfer transfer         48408 28. Nov 13:02 test_anonym_19-11-2023.log
-rw-r--r-- 1 transfer transfer    9329096219 28. Nov 13:03 test_anonym_21-11-2023.dmp.gz
-rw-r--r-- 1 transfer transfer         48407 28. Nov 13:03 test_anonym_21-11-2023.log

最新のパターンのみを送信したいので、*.gz次のようにしてパターンを識別できます。*.log\.\/test_anonym_.*\.*

user@host:~/folder$ find . -type f -regex '\.\/test_anonym_.*\.*' | sort -r | head -n 2
./test_anonym_21-11-2023.log
./test_anonym_21-11-2023.dmp.gz

または、次のようにリモコンから直接識別できますssh(非常に効果的です)。

user@host:~/folder$ ssh -qx user@host "ls -t /home/user/folder | sort -r | head -n 2"
test_anonym_21-11-2023.log
test_anonym_21-11-2023.dmp.gz

次のrsyncコマンドは、1つのファイル形式に対してのみモードを使用し、2つの形式の最新のファイルを認識しないため、送信しすぎます。

user@host:~/folder$ rsync -av --stats --include='test_anonym_*.gz' --exclude='test_*.*' user@host:/home/user/folder/ /home/user/folder/

test_anonym_19-11-2023.dmp.gz
test_anonym_21-11-2023.dmp.gz

多くのマニュアルページに似た投稿を見た後、およびをssh一緒に試してみましたが、完了していない段階で失敗しました。rsyncssh

ssh user@host "ls -t /home/user/folder/ | sort -r | head -n 2" | rsync -0 --stats --files-from=- -av user@host:/home/user/folder/ /home/user/folder/

rsyncwithオプションを試しましたが、--files-from=両方の例の構文がわからないため失敗しました。

rsync -a --stats --files-from=<(ssh user@host 'find . -type f -regex '\./test_anonym_.*\.*' | sort -r | head -n 2') --exclude='test_*.*' user@host:/home/user/folder/ /home/folder/folder/

rsync -a --stats --files-from=<(find . -type f -regex '\.\/test_anonym_.*\.*' | sort -r | head -n 2) --exclude='test_*.*' user@host:/home/user/folder/ /home/folder/folder/

必要なファイルを見つけて同期するためにすべてを1つにまとめる方法(または可能であれば)がわかりません。今は本当に詰まっています。どうすればいいですか?私はそれを私のワークステーションで使用しzsh、私のリモコンでも使用しますbash

ここで私の期待をもう一度言うと、私はリモートで私のパターンと一致し、そのタイプの最新の2つのファイル、iEとWitchの異なるタイプの2つのファイルがrsync欲しいです。sshtest_anonym_21-11-2023.logtest_anonym_21-11-2023.dmp.gz

ベストアンサー1

GNUツールがある場合は、それを使用してfind最新の2つの変更されたファイルを識別し、それらのファイルのみを転送できます。リモートホストからファイルを抽出する必要があるため、プロセスは少し複雑ですが、これはsshより多くの参加が必要であることを意味します。

最後に変更された2つのファイルが転送されるファイルのペアであると仮定でき、GNU拡張子(または類似)を持つツールがある場合:

ssh -qn remoteHost "find folder -name 'test_anonym_*' -printf '%T@ %p\0'" |
    sort -z -k1,1rn |
    head -z -n2 |
    cut -z -d' ' -f2- |
    rsync --dry-run -av --files-from - --from0 remoteHost: "$HOME/folder"

GNUツールがない場合は、予期しないファイル名に注意する必要があります。ただし、このパイプラインは、次に配置するファイル名を制御できる限り機能しますfolder

ssh -qn remoteHost ls -t folder |
    head -n2 |
    rsync --dry-run -av --files-from - --from0 remoteHost:folder/ "$HOME/folder"

どちらの場合も、--dry-runコードが期待どおりに機能していると満足している場合は、コードを削除してください。

ファイルのみを保証できdmp.gz、関連ファイルを抽出したい場合、log状況はより複雑になります。しかし、あなたの問題はこれを必要としないようです。

おすすめ記事