I want to rsync the latest two files of a certain pattern between two servers in different environments:
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 Since only want to transfer the latest *.gz and *.log of the pattern \.\/test_anonym_.*\.* I can do something like this to identify them:
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 Or directly identify them on the remote with ssh like this (which works fine):
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 The following rsync command transfers too much because I am only using a pattern of one file type and not identifying the latest files of both types:
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 I tried using ssh and rsync together after sifting through many man pages and posts like this, but it fails in the ssh step which is never completed:
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/ I tried using rsync with --files-from= option but have also failed because I am unsure of the syntax here in my two examples:
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/ I'm not sure how to put it all together (or if it's even possible) to find and sync the desired files; I'm really stuck now. How can I make this work? My workstation uses zsh, my remotes all use bash.
To reiterate my expectations here: I want to rsync (with/without ssh) two files of a different type from a remote, i.E. test_anonym_21-11-2023.log and test_anonym_21-11-2023.dmp.gz witch match my pattern and are the latest two files of their type.