【发布时间】:2019-07-10 12:11:16
【问题描述】:
已经有一些关于这个话题的答案,但几乎所有人都说解析ls -l 的输出很糟糕,因此建议使用其他方法。
但是,我使用的是 ncftpls -l,所以我不能使用 shell glob 或 find 之类的东西——我认为我确实需要实际解析 ls -l 输出。如果您不熟悉 ncftpls,请不要担心,输出返回的格式与您刚刚使用 ls -l 时完全相同。
在公共远程 ftp 目录中有一个文件列表,我不想每次启动 cronjob 时都重新下载每个所需文件,从而给远程服务器带来负担。我想检查,对于 ftp 目录中的每个文件子集,该文件是否在本地存在;如果没有,请下载它。
这很简单,我只是使用
tdy=`date -u '+%Y%m%d'`_
# Today's files
for i in $(ncftpls 'ftp://theftpserver/path/to/files' | grep ${tdy}); do
if [ ! -f $i ]; then
ncftpget "ftp://theftpserver/path/to/files/${i}"
fi
done
但我遇到了一个问题,有时 cron 作业会下载一个尚未完成上传的文件,因此当它下一次触发时,它会跳过部分下载的文件。
所以我想添加一个检查,以确保对于我已经拥有的每个文件,本地文件大小与远程服务器上相同文件的大小相匹配。
我正在考虑解析ncftpls -l 的输出并使用awk,类似于
for i in $(ncftpls -l 'ftp://theftpserver/path/to/files' | awk '{print $9, $5}'); do
...
x=filesize # somehow get the file size and the filename
y=filename # from $i on each iteration and store in variables
...
done
但我似乎无法在循环的同一迭代中将文件名和文件大小从服务器获取到局部变量中;每次迭代时,$i 在 awk 字符串中的 $9 和 $5 之间交替。
如果我能设法在每次迭代中将文件名和文件大小放入单独的变量中,我可以简单地使用stat -c "%s" $i 来获取本地大小并将其与远程大小进行比较。然后在我还没有的每个远程文件上都有一个简单的ncftpget。我也修改了lftp 之类的同步程序,但运气不佳,宁愿这样做。
任何帮助表示赞赏!
【问题讨论】: