SFTP - 递归获取新文件

SFTP - 递归获取新文件

我有一个像这样的删除文件系统结构:

+ /measure
    + / 2013-09
         + / 2013-09-04
              + / fooinstrument
                   + result03343445845.csv
                   + result03343445846.csv
              + / barinstrument
                   + result03343445847.csv
                   + result03343445848.csv

它包含很多文件,具有层次结构。我有只读通过访问安全FTP(服务器上没有其他可用的协议(如 CIFS)或任何特殊软件)。 (所以我无法在源主机上安装任何软件。)

我想使用 cron 作业每晚将这些文件导入我的数据库(cron 作业本身没有问题)。因此,我想递归下载所有新文件到我的本地文件系统,然后将每个下载文件的路径传递给我的应用程序(其文件名作为命令行参数),例如:

/usr/local/bin/myapp -import /srv/localstorage/result03343445845.csv

这次调用myapp并不是关键点。如果我可以通过将下载器的输出传输到某个文件来获取所有下载路径的列表,那么我可以稍后逐行读取文件列表并调用该应用程序。这没问题。

我不在乎原始目录层次结构。我的主要目标是将文件传输到本地文件系统,以便我的命令行工具可以使用文件名作为输入。因此,我是否有服务器提供的深层层次结构的副本,或者所有文件是否进入同一目录,并不重要。后者可能更有趣,因为文件名是唯一的序列。因此将所有文件一起移动到一个目录中没有问题。

+ / localstorage
     + result03343445845.csv
     + result03343445846.csv
     + result03343445847.csv
     + result03343445848.csv

我的一个问题是,源文件永远留在服务器上。因此,服务器不会删除我已经下载的旧文件,因为我不是唯一收集这些数据的人。因此,脚本必须“记住”哪些文件是旧的(=> 不要下载!),例如,通过保留所有曾经检索过的文件的本地副本。(如果两个文件的文件名相同,则可以安全地将它们视为相等,因为文件名由序列号组成。因此无需进行内容比较。)

另一个重要点:一年后,可能会有 30,000 个文件甚至更多。每晚下载所有文件(包括我已经拥有的旧文件)是不合理的。因此,真正需要的是只下载新文件(新 = 本地副本中没有此文件名)。

最简单、最好的方法是什么Linux(Debian)?我想到了一个使用 的 shell 脚本sftpscp或者甚至可能curl?非常感谢您就此类脚本提供的建议和想法!

// 编辑:顺便问一下,您觉得怎么样?这个问题是否更适合 Serverfault?

答案1

rysnc是一款用于同步目录层次结构的出色实用程序。理想情况下,您会rsync在服务器和客户端上都安装它,但即使只安装在客户端上,它也能正常工作。这些命令将传输本地计算机上尚不存在的文件并myapp在其上运行。

cd DESTINATION_DIR
rsync -rv --ignore-existing --log-format='%o %f' USER@HOST:/PATH_TO_measure_DIR . | grep recv | sed "s,recv ,," | xargs -i sh -c "[ -f {} ] && /usr/local/bin/myapp -import {}"

rsync带来文件(保留目录结构)然后我们解析出接收文件的列表,确保它们是常规文件(我们不想myapp在新创建的目录上运行),然后调用myapp它们。

答案2

将服务器目录挂载到您本地:

sshfs  username@servername:/path/ /mount

或者

curlftpfs username@servername:/path/ /mount

然后

rsync -av /mount /data/ > /data/rsync.log

它只复制新文件,并且文件名在日志文件中

相关内容