从远程服务器复制最新的三个文件

从远程服务器复制最新的三个文件

除了其他类型的文件之外,远程服务器(支持 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登录 shellxyzzsh

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\}" .

相关内容