368 views
首页 > 工作 > 个人感觉比wget更强大的lftp

个人感觉比wget更强大的lftp

wget功能很强大,manual手册都写了好多页,基本上大家想到的功能都有对应的选项,想干啥的时候先man一把基本上都能找到。

但是我个人觉得有一个缺点就是不支持多线程下载,像我上次写的用wget对源做备份,公司带宽其实挺高的,平时用sohu,163的源下东西都能上兆,不支持多线程的话其实速度就上不去,速度到了四五百K就上不去了,这样就很慢了,做个备份要好几个小时。

于是我找了另一个命令行下的下载工具,lftp,也支持mirror的功能。

lftp的功能很强大,这里主要讲讲比wget强的地方就是支持同时下载几个文件,每个文件还可以指定几个线程下载。像我指定同时下载5个文件,每个文件5个线程,速度大概有三四兆,半个小时备份就做完了。

另外一个牛逼的地方在于,当我们做完一次备份,定期更新的话就不需要每次都重新下载了,但是用wget更新的时候,wget是发现服务器端的文件跟本地的不一样(文件大小或者修改时间),或者服务器端有的文件本地没有,就会重新下载下来,这样更新其实是有漏洞的,那就是要是你本地有这个文件,服务器那边删掉这个文件了,wget是不作处理的,虽然这样弄对做源应该是没多大影响,但是会让本地的文件越来越多,文件多了自己想删都不知道删什么。lftp的同步更新功能就可以发现这点,要是服务器端没这个文件了,它更新的时候就会把本地的也删掉,这点很赞!
像我上次做备份用的命令是

wget -q -b -m -c -np -P /mnt/mirror –random-wait -k http://repo.meego.com/MeeGo/builds/trunk/1.1.80.11.20101221.1/

以后再备份其实都不用重新再下载,跟服务器同步更新就行了。

wget -q -b -m -c -np -P /mnt/mirror –random-wait -N -k http://repo.meego.com/MeeGo/builds/trunk/1.1.80.11.20101221.1/

加上-N的选项,就是比较文件的时间戳,比本地新的就会被重新下载,不过好像-m本身也包含这个功能了,我没试。

另外,这次搞的时候试了一下-X功能,就是不包含的目录,比如说我们对一些源备份的时候,有的目录底下是有iso文件的,这种备份了都没什么用,想整体备份但是去掉某些目录,这时候就可以用-X选项把要去掉备份的目录列出来。-X要把目录的完整路径写出来,而且通配符支持的也不完全,比如说要想去掉a/b/c这个目录,-X c/或者-X *c*都是不行的,只能写全或者*/*/*c*。

所以用wget 备份是wget -q -b -m -c -np -P /mnt/mirror –random-wait -X ‘*/*/*/*/*/*images*’ -N -k http://repo.meego.com/MeeGo/builds/trunk/1.1.80.11.20101221.1/

这样备份文件是会越来越多,用lftp就不会存在这个问题。

 

lftp的选项也挺多的,因为它既可以当做一个直接下载的工具,也算是一个ftp客户端,通过一些命令可以跟ftp服务器交互操作。

-c选项是直接执行的命令,lftp -c “mirror –delete –delete-first –ignore-time –only-newer –parallel=5 –use-pget=3 -x images/ http://repo.meego.com/MeeGo/builds/trunk/1.1.80.11.20101221.1/ ./” 就完成了备份了。

lftp的命令就比较简洁,-x images/直接就不下载images文件夹了,–parallel=5是同时下载5个文件,–use-pget是制定每个文件几个进程,–ignore-time是直接比较文件大小,不关心时间,这样速度会快些,其他的命令man一下就行了。

最后想明白了,有的文件在上传的时候用了MDTM,这样mirror下来的文件就会跟remote一样,不然修改时间就是本地下载完的时间,没用MDTM的文件在mirror用-only-newer选项是没有办法过滤掉的,只能重新下载,重新下载的时候还是用–ignore-size,不用ignore-time,因为这样至少可以过滤掉一部分用过MDTM的文件。

lftp -c “mirror –delete –delete-first –ignore-time –only-newer –parallel=5 –use-pget=3 -x images/ http://repo.meego.com/MeeGo/builds/trunk/1.1.80.11.20101221.1/ ./”  就是用这些选项

MB的,其实也不是我的电脑也不是我的网,直接定期删除重新下载最简单,就是有点麻烦。

设计了几个测试方法:

1.在本地新建一个文件,touch testfile,执行命令,发现会把testfile删掉,正面–delete正常工作。

2.在本地删除一个文件,以相同的名字建立一个,tsocks lftp -c “mirror –only-newer –delete –ignore-size –delete-first –parallel=5 –use-pget=5 -x images/ http://repo.meego.com/MeeGo/builds/trunk/1.1.80.11.20101221.1/ /mnt/sdb7/mirror/repo.meego.com/MeeGo/builds/trunk/1.1.80.11.20101221.1” 发现没有办法删掉 –only-newer和 –ignore-size不管用

尝试去掉–ignore-size选项,还是不管用。这个就跟我一开始发现的问题一样了,试着用lftp -c “mirror –delete –ignore-size –delete-first –parallel=5 –use-pget=3 -x images/ http://repo.meego.com/MeeGo/builds/trunk/1.1.80.11.20101221.1/ ./”  我突然发现这实际上就是把本地的文件又重新下载了一遍。

3.所以现在问题回到,要是remote的文件修改过了,但是文件大小没变,而且时间万一还要比本地的更旧,怎么确保可以做好备份。

结论,想不出来,MB的全下载好了,反正又不是老子的机子,多开几个进程算球了。

anyShare分享到:
分类: 工作 标签: , , ,
  1. 2010年12月28日03:10 | #1

    发现了一个不恰当的地方,原来的命令,

    lftp -c "mirror –delete –delete-first –ignore-time –only-newer –parallel=5 –use-pget=3 -x images/ http://repo.meego.com/MeeGo/builds/trunk/1.1.80.11.20101221.1/ ./"

    –ignore-time意思是不管时间戳,只文件比较大小,这样有个漏洞就是万一文件修改了,但是大小没变,就不会进行更新。–only-newer的意思是只下载服务器有但是本地没有的文件,这个也去掉。

    最后的命令是

    lftp -c "mirror –delete –ignore-size –delete-first –parallel=5 –use-pget=3 -x images/ http://repo.meego.com/MeeGo/builds/trunk/1.1.80.11.20101221.1/ ./"

    –delete删除 remote site不存在的文件。

    –ignore-size 在决定下载的时候不考虑文件大小的改变 我觉得–ignore-time和这个选项加不加都没什么影响。网上找到的“–only-newer: 只下载新的文件。mirror的判定新文件是通过文件大小和修改时间来判定的,我们可以使用–ignore-time,来屏蔽时间判定,这样mirror只通过大小来判断新闻,是同步速度加快”。

    –delete-first 先删掉本地文件再进行下载,不是采用续传的方式

    [回复]

  2. 2010年12月29日11:58 | #2

    这样还是不对!我发现这样弄了以后每次更新,本地文件的修改时间就改成了本地修改的时间,而且相当于每个文件都重新下载了一遍!

    [回复]

  1. 本文目前尚无任何 trackbacks 和 pingbacks.