除了其他类型的文件之外,远程服务器(支持 SCP)上还有一组 .doc 文件。
我看到一个脚本:
FILE=`ssh abc@xyz ls -ht /tmp/*.doc | head -n 1`
rsync -avz -e ssh abc@xyz:"$FILE" .
使用参数“head -n 1”可以从远程服务器复制最新的文件。但我发现即使使用参数“head -n 3”,它也无法从远程服务器复制最新的三个文件。
答案1
如果abc
登录 shellxyz
是zsh
:
ssh abc@xyz 'cd /tmp && tar cf - ./*.doc(.LM-100om[1,3]) | gzip -3' |
gunzip | tar xvf -
如果没有zsh
(但zsh
已安装):
ssh abc@xyz "cd /tmp && exec zsh -c 'tar cf - ./*.doc(.LM-100om[1,3]) | gzip -3'" |
gunzip | tar xvf -
无论如何,请注意/tmp
(或任何世界可写目录)是一个雷区。上面,我们非常小心地只选择小于 100 MiB 的常规文件(带有(.LM-100)
),并且tar
不会遵循符号链接或读取设备或命名管道的内容,但仍然存在一个竞争条件,即有人可以将文件放大到几个 tebibytes在正在扩展的 glob 和tar
正在运行的命令之间。
当然,任何人都可以将.doc
扩展名为 的恶意软件放入 中/tmp
,因此您需要非常小心地对待这些下载文件。
最好在私有目录中而不是在/tmp
.
答案2
ls
每行输出 1 个文件名,head
修剪 N 行,但rsync
期望处理一个文件或 glob,您可以这样做:
FILES=`ssh acb@xyz 'ls -t /tmp/*.doc' | head -n 3 | tr '\n' ','`
rsync -avz -e ssh abc@xyz:"\{$FILES\}" .