是否可以让 SCP 按日期过滤复制的文件,例如,如果您想复制 12/29 创建的所有文件并忽略其他文件?
答案1
您不能直接使用 来执行此操作scp
。unix 方式是组合工具,您需要命令find
。
以下是按给定日期搜索文件的示例:
touch --date "2007-01-01" start
touch --date "2008-01-01" end
find -type f -newer start -not -newer end
我从这里取了这个例子:http://www.cyberciti.biz/faq/linux-unix-osxfind-files-by-date/
要将其输入到 scp 你可以这样做:
find -type f -newer start -not -newer end -exec scp {} dest: \;
这将对每个文件调用一次 scp,这可能会很慢,因为它每次都需要建立连接。如果您只有少数几个文件并且名称中没有空格,您可以这样做:
scp `find -type f -newer start -not -newer end` dest:
答案2
这里给出了一个有效的(一行!)替代方案(由@sudodus 提供),它使用“cpio”在复制模式下通过 SSH 通道进行复制。您可以根据需要定制 find 参数,也许可以使用 time/min/newer 测试。
要获得准确的日期和时间测试,请在源系统上创建一个具有正确时间和日期的虚拟文件,使用 find -newer 测试,或使用手册页的 -newerXY 测试。请参阅https://linux.die.net/man/1/find
在远程系统上运行的 find 命令的输出通过 ssh 安全地传输回本地系统并保存。
它似乎满足了您的所有要求,但没有使用“scp”——这可能会影响您的评分。但它确实使用了 Unix 工具的组合——这是 Unix 方法!
无论如何,scp 是最常见的情况的捷径,当需要过滤文件时,这种方法更加强大。
ssh username@ip-adress '(cd /path/to/sourcedir; find . -print | cpio -oBav -Hcrc)' | ( cd /path/to/targetdir && cpio -ivumd )
https://askubuntu.com/questions/1080590/how-to-use-find-in-scp-command