rsync 目录中的 N 个最新文件

rsync 目录中的 N 个最新文件

将目录中的 n 个最新文件 rsync 到远程服务器的最简单方法是什么?

答案1

最简单的方法是运行 zsh 而不是 bash。

rsync -a -- /path/to/directory/*(om[1,42]) remote-server:

在括号中,om按反向修改时间(即按年龄增加)对文件进行排序,并[1,42]选择前 42 个匹配项。

如果您只想要常规文件而不是目录,请.在左括号后添加一个。有关更多可能性,请参阅“glob 限定符”zshexpn手册页

如果您想要匹配以 为根的目录树中的文件/path/to/directory,而不仅仅是该目录内的文件,请使用/path/to/directory/**/*(.om[1,42])。但是,这会将所有文件发送到目标上的同一目录。

答案2

假设您想从当前工作目录发送文件:

rsync `ls -tp | grep -v / | head -n <n>` <destination> <options>

就可以了。例如:

rsync `ls -tp | grep -v / | head -n 10` user@host:/dest/dir/ --progress --compress

如果当前工作目录中找不到任何文件,或者任何顶部文件包含空格或其他特殊字符,则会出现错误。

周围的 ` 字符ls -tp | grep -v / | head -n <n>告诉 bash 运行命令并用结果文件列表替换它们,作为空格分隔的列表。选项-t告诉它ls按时间戳排序,-p告诉它在目录名称后添加一个/,而 grep 部分会筛选出以 结尾的行,/这样您就不会最终发送目录。如果您希望根据创建时间而不是修改时间来判断最新文件,请添加-c到选项中ls(但请注意,某些程序会删除和替换文件而不是更新它们,因此即使文件似乎存在的时间更长,ctime 和 mtime 也可能相同)。

我不会声称这是毫无疑问的最容易但这将是我首先想到的方法。


(mwm 的评论中的子问题)

那反过来呢?从服务器到本地?

这会稍微复杂一些,因为我认为您不能像在本地文件源那样在 rsync 命令行上拥有多个远程文件源。您可以rsync通过 over 在服务器上运行ssh,打开一条隧道回到本地sshd(使用与运行 rsync 相同的ssh调用)以接收连接,本质上是从另一端使用相同的命令。

答案3

我无法让 zsh 选项为我工作,但可以做到这一点:

ls -tr | head -n 10 | rsync --files-from=- user@host:/dest/dir/

将 10 替换为您想要的最新文件的数量。

重要提示:请注意,与此处的其他解决方案一样,rsync 将重新排序这些文件并按其希望的顺序发送它们,通常是最旧的文件首先发送 :(。我仍在寻找一种解决方案,让 rsync 首先发送最新的文件。当我可以确定其优先级时,需要对 rsync 进行更深入的研究。您可以通过在 rsync 命令上使用 -vv 来查看这一点。

相关内容