如何使用scp下载文件夹中的最新文件?


10

我想运行一次scp传输,将某个目录中的最新(最新)文件下载到我的本地目录中。

像这样:

  • 来源root@rimmer.sk:/home/rimmer/backups/
  • 目的地/home/rimmer/backups/

虽然仅在中获取最新文件,而不是所有文件backups

Answers:


12

假设你有变量serverdir定义,你可以做

$ dir="~"
$ server="user@server.com"
$ scp $server:$dir/$(ssh $server 'ls -t $dir | head -1') .

首先在哪里寻找最新文件,然后将其复制。

注意:我没有检查它的安全性(例如,最新条目是文件夹)


如果它是一个目录,则不会显示任何内容。您需要使用 scp -r
slm

@slm正确,但是他可能不想复制它。
伯恩哈德

如果scp获取中断,则必须从头开始重新开始复制​​,然后rsync可以从中断处重新开始。
slm

对于bash,我需要在的参数中将单引号替换为双引号ssh
约翰内斯·比特纳

1
您可以通过执行以下操作删除第一个$ dir(/*在第二个$ dir的末尾添加a ):scp $server:$(ssh $server 'ls -t $dir/* | head -1') .
Jesse

1

scp它只是愚蠢的,因为它只是盲目地将文件从源复制到目标。如果您想要更智能的复制文件,则需要使用诸如的工具rsync

$ rsync -avz root@rimmer.sk:'$(find /home/rimmer/backups/ -ctime -1)' /home/rimmer/backups/

这只会将前一天(-ctime -1)的rimmer.sk备份目录中丢失或更改的文件复制到本地备份目录中。

-ctime n
   File's  status  was last changed n*24 hours ago.  See the comments for 
   -atime to understand how rounding affects the interpretation of file 
   status change times.

参考文献


rsync的问题是相同的。如果我已经离线了两天,它将尝试复制所有天的所有备份,这根本不需要,而且数量巨大。
理查德·罗德里格斯

@RichardRodriguez-好,请更新您的问题,并具体说明您要执行的操作。
slm

2
@slm:我认为问题是正确的。我只想在目录中下载最新文件。我还能解释什么?:)
理查德·罗德里格斯

@RichardRodriguez-此目录中有哪些文件?列出示例将很有帮助。
slm

1
为什么要投反对票?
slm

0

聚会晚了一点,但是也许使用ssh和rsync的解决方案对某些人有用:

source_host="yourhost.com"
source_dir="/a/dir/on/yourhost.com/"
target_dir="/the/dir/where/last_backup/will/be/placed"
last_backup=$(ssh user@${source_host} "ls -t ${source_dir} | head -1")
if [ "${last_backup}" == "" ]; then
    echo "ERROR: didn't find a backup, cannot continue!"
else
    echo "the last backup is: ${last_backup}"
    rsync -avzh user@${source_host}:${source_dir}/${last_backup} ${target_dir}
fi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.