我有一个正在运行的 ftp 服务器,它不定期地生成最新文件。该文件存储为:
Home
-> T22:30:10
-> new.txt
,最新的将是(一个新文件夹)
Home
-> T23:10:25
-> new.txt
(注意这是一个最新时间的新文件夹)
我需要在 Linux 机器上实现一些东西(可以是任何东西,C 代码,Bash 脚本等)来拉取最新的文件。
我研究了两种选择:
使用 libcurl,传递目录列表,然后选择最新文件。这真的很烦人而且很耗时,而且我仍然找不到简单的方法来做到这一点。
使用lftp,在初始化时,删除服务器中的所有文件,这样每次调用lftp下载东西时,它都是最新的。 (这个方法只是概念性的,我还没有在现实生活中尝试过)。
有更简单的选择吗?
答案1
一种通常很方便的方法是挂载文件,然后像访问普通本地文件一样访问它们。对于通过 FTP 访问的服务器,您可以使用卷曲FTPFS。
mkdir theserver
curlftpfs theserver.example.com theserver
您需要将用户名和密码传递给curlftpfs,无论是在命令行上(这是不安全的,因为您计算机上的其他用户能够看到它们)或在文件中~/.netrc
(强力推荐)。这是一个 netrc 行示例:
machine theserver.example.com login remoteusername password swordfish
现在您已经将 FTP 服务器作为目录安装在计算机上,您可以使用常用命令,例如ls
、cp
等。例如,从按字典顺序排列最后的目录复制文件(如果您的文件名实际上包含时间之前的日期):
set -- theserver/remote/path/T*
eval "last=\${$#}"
cp -p -- "$last/new.txt" "/some/where/local/${last##*/}.txt"
或者复制最新的文件,假设涉及的文件名不包含不可打印的字符或换行符:
cd theserver/remote/path
last=$(ls -t -- T*/new.txt | head -n 1)
cp -p -- "$last" "/some/where/local/${last%/*}.txt"
答案2
如果您可以定期运行脚本,您可以使用wget -N
,请参阅:
https://superuser.com/questions/283481/how-do-i-properly-set-wget-to-download-only-new-files
您可以创建一个脚本,例如:
cd /var/download_here/
wget -N ftp://example.com/new.txt --ftp-user="my_user" --ftp-password="my_password"
并添加crontab
条目,例如:
*/5 * * * * /path/to_script
请注意源文件是如何创建的。如果有东西正在写入并且文件未锁定 - 您最终可能会下载不完整的文件。