FTP获取和删除多个文件

时间:2014-03-18 14:00:56

标签: ftp

我必须通过FTP获取和删除多个文件,所以我写了这个脚本:

open ftp.myftpserver.org user pass cd folder lcd E:\localdir mget * mdel * bye

这可行,但不安全,因为folder正在从其他来源提供,mdel *步骤可能会删除同时上传的文件。

我想解决方案可能是将文件远程移动到另一个文件夹,在流程开始时构建文件列表,但我不知道如何制作它。

可能吗?

4 个答案:

答案 0 :(得分:2)

FTR我遵循了很好的提示,我成功地做了一些工作,也许不优雅但是有效:

获取文件列表的第一步:

getfilelist.bat


    open ftp.myserver.it
    myuser
    pass1234
    cd ftpfolder
    prompt n
    lcd E:\localdir
    ls *.??? filelist.txt
    bye

下载并删除上述文件的第二步

movefiles.bat


    @echo off

    setlocal enableextensions
    setlocal enabledelayedexpansion

    echo open ftp.myserver.it>>myscript
    echo user myuser pass1234>>myscript
    echo cd ftpfolder>>myscript
    echo prompt n>>myscript
    echo ascii>>myscript
    echo lcd E:\downloaddir>>myscript
    for /F "usebackq tokens=1,2* delims=," %%G IN ("E:\localdir\filelist.txt") DO ECHO rename %%G %%G_TMP>>myscript
    echo mget *_TMP>>myscript
    echo mdelete *_TMP>>myscript
    echo bye>>myscript
    ftp -n -s:myscript
    del filelist.txt
    del myscript
    e:
    cd E:\downloaddir
    ren *.???_TMP *.???

用于调用上述步骤的bat文件:

    E:
    cd E:\localdir
    ftp -i -s:E:\localdir\getfilelist.bat
    E:\localdir\movefiles.bat

希望有所帮助

答案 1 :(得分:0)

不知道你是否可以使用ftp客户端的脚本来做到这一点。

最好使用您选择的语言作为程序或scipt使用FTP库,这样您就可以更好地控制FTP操作。例如perl与Net :: ftp,java等。

然后您可以实现以下算法:

remote cd to required folder
localcd to required folder 
list current files in remote folder
for each file in list that matchs required pattern
   get file
   if get ok then 
      delete file
   else
      log error,exit or whatever error handling you want
   endif
endfor

还需要确保您没有尝试获取正在编写的文件,具体取决于使用文件锁可能为您处理的o / s,但您需要确保文件在两个阶段的过程中写入远程目录。首先,临时目录或文件名与您要检查的文件模式不匹配,然后重命名或移动到您将检测到的正确位置和名称。

答案 2 :(得分:0)

好吧,那么我认为你可以使用两个单独的ftp调用和脚本来实现我称为批处理脚本的算法。第一个列出要从远程目录传输的文件,第二个用于从列表中获取和删除单个文件。

必须在每次循环迭代时动态创建文件获取脚本以获取下一个文件。

cd to working dir
Run FTP with script to: 
     cd to remote folder
     list files matching required pattern and store in local file
       (e.g: ls files_*.txt filelist.txt)

for each file in file list created above (e.g. use 'for /f ...' command to loop through filelist.txt)
   create temp ftp script to:
       cd to remote dir
       lcd to local dir
       get file
       del file
   run FTP with temp script
endfor

这个网站有一个做similer的例子(注意脚本如图所示,注释提供所需更正的详细信息)。

http://www.computing.net/answers/programming/batch-ftp-script-list-rename-get-delete/25728.html

答案 3 :(得分:0)

我有类似的问题。看起来很多人在这里挣扎; - )

我必须下载多个文件并在远程服务器上成功下载后删除它们以避免双重处理。在执行import Backbone from 'backbone'; require('backbone.stickit/backbone.stickit'); .... const Backbone2 = Backbone; export {Backbone2}; 远程系统时添加更多文件的可能性非常小。因此,mget可能会删除未传输的文件。

我的方法是不使用除FTP命令以外的任何东西。我们走了:

mdelete

我一眼就将所有文件移动到远程服务器上的额外目录中。应该非常快,因为这在当地发生。将文件转移到传输目录后,我会执行真正的cd <dir on remote server> mkdir Transfer mv *.* Transfer mget Transfer\*.* del Transfer\*.* rmdir Transfer 下载。这可能需要更长时间,同时可以在远程服务器主目录上安全地上载更多文件。

下载完成后,我删除了传输目录中的所有文件并删除了dir本身。