我试图只镜像目录树中包含特定目录名的分支。我花了几个小时尝试不同的东西,但都无济于事。
远程FTP站点的目录结构如下:
image_db
movies
v2
20131225
xyz
xyz.jpg
20131231
abc
abc.jpg
AllPhotos <-- this is what I want to mirror
xyz
xyz.jpg
abc
abc.jpg
v4
(similar structure to 'v2' above, contains 'AllPhotos')
...
tv_shows
(similar structure to 'movies', contains 'AllPhotos')
other
(different paths, some of which contain 'AllPhotos')
...
我正在尝试创建一个只包含"AllPhotos"目录的本地镜像,并保留它们的父路径。
我尝试过这种变体:
lftp -e 'mirror --only-newer --use-pget-n=4 --verbose -X /* -I AllPhotos/ /image_db/ /var/www/html/mir_images' -u username,password ftp.example.com
其中"-X/*"排除所有目录,"-I AllPhotos/"仅包括AllPhotos。这不起作用,lftp只是复制所有内容。
我还尝试了这种变体:
lftp -e 'glob -d -- mirror --only-newer --use-pget-n=4 --verbose /image_db/*/*/AllPhotos/ /var/www/html/mir_images' -u username,password ftp.example.com
lftp处理远程目录结构,而实际上没有为我创建任何东西。
基本上,我只想镜像那些在完整目录路径中有字符串"AllPhotos"的文件。
更新1:
如果我可以用wget、rsync、ftpcopy或除lftp之外的其他实用程序来实现这一点,我欢迎提出替代方案。
尝试wget对我也不起作用:
wget -m -q -I /image_db/*/*/AllPhotos ftp://username:password@ftp.example.com/image_db
它只获取整个目录结构,尽管wget文档中说-I路径中允许使用通配符。
更新2:
经过进一步的调查,我得出的结论是,我可能应该编写自己的镜像实用程序,尽管我仍然怀疑我以错误的方式处理lftp,并且有一种方法可以使它只镜像绝对路径中有特定字符串的文件。
一个解决方案:
curl -s 'ftp://domain.tld/path' |
awk '/^d.*regex/{print $NF}' |
xargs wget -m ftp://domain.tld/path/
或使用lftp
:
lftp -e 'ls; quit' 'ftp://domain.tld/path' |
awk '/^d.*regex/{print $NF}' |
xargs -I% lftp -e "mirror -e %; quit" ftp://domain.tld/path/