将目录中的 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 来查看这一点。