異なる環境にある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
一緒に試してみましたが、完了していない段階で失敗しました。rsync
ssh
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/
rsync
withオプションを試しましたが、--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
欲しいです。ssh
test_anonym_21-11-2023.log
test_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
状況はより複雑になります。しかし、あなたの問題はこれを必要としないようです。