【问题标题】:Recursive FTP directory listing in shell/bash with a single session (using cURL or ftp)使用单个会话(使用 cURL 或 ftp)在 shell/bash 中列出递归 FTP 目录
【发布时间】:2011-02-06 13:03:55
【问题描述】:

我正在编写一个小 shellscript,它需要遍历 ftp 服务器上的所有文件夹和文件(递归)。到目前为止,使用 cURL 一切正常 - 但它非常慢,因为 cURL 为每个命令启动一个新会话。因此,对于 500 个目录,cURL 会执行 500 次登录。

有人知道,我是否可以使用 cURL 保持登录状态(这将是我最喜欢的解决方案),或者我如何在 shell 脚本中只使用一个会话来使用 ftp?

我知道如何执行一组 ftp 命令并检索响应,但是对于递归列表,它必须更动态一些...

感谢您的帮助!

【问题讨论】:

    标签: bash session shell ftp curl


    【解决方案1】:

    只是总结到目前为止其他人所说的话。如果您正在尝试编写一个可移植的 shell 脚本作为批处理文件,那么您需要使用 lftp 解决方案,因为some FTP server 可能无法实现ls -R。在以下示例中,只需将 123.456.789.100 替换为 ftp 服务器的实际 IP 地址即可:

    $ lftp -c "open 123.456.789.100 && find -l && exit" > listing.txt
    

    查看lftp的man页面,转到find部分:

    列出目录中的文件(默认为当前目录) 递归地。这可以帮助缺少 ls -R 支持的服务器。你 可以重定向此命令的输出。

    但是,如果您有办法确定远程 ftp 服务器是否实现了对ls -lR 的适当支持,那么更好(=更快)的解决方案将是:

    $ echo ls -lR | ftp 123.456.789.100 > listing.txt
    

    仅供参考,如果我执行第一个命令 (lftp+find) 需要 0m55.384s 来检索完整列表,而如果我执行第二个命令 (ftp+ls-R) 则需要 0m3.225s。

    【讨论】:

      【解决方案2】:

      命令实际上是ncftpls -R。它将递归列出 ftp 文件夹中的所有文件。

      【讨论】:

      • 发现部分FTP服务器不支持这种方式。
      【解决方案3】:

      如果可能,请尝试使用 lftp 脚本:

      # lftp script "myscript.lftp"
      open your-ftp-host
      user username password
      cd directory_with_subdirs_u_want_to_list
      find
      exit
      

      接下来你需要 bash 脚本来运行这个 lftp 命令并将其写入文件:

      #!/bin/bash
      lftp -f myscript.lftp > myOutputFile
      

      myOutputFile 现在包含目录的完整转储。

      【讨论】:

      【解决方案4】:

      您可以连接到 ftp 服务器,使其接受来自标准输入的命令并写入标准输出。创建两个命名管道(“fifos”,man mkfifo),将 ftp 命令的标准输入和标准输出分别重定向到其中一个。然后,您可以将命令写入 stdin-connected-fifo 并从 stdout-fifo 读取它们(例如,使用 bash 的read 逐行读取)。然后使用结果来查看您需要在哪里发送另一个列表命令(并打印它或您想做的任何事情)

      简而言之:不是 bash 脚本适合 :) (当然,直到你找到一个可以自己做你想做的事情的工具)

      【讨论】:

        【解决方案5】:

        如果您只想创建所有文件和文件夹的列表,您可以改用ssh。像这样的东西(但检查正确使用的文档)

        $ ssh user@host "ls -R /path"
        

        【讨论】:

        • 这并不能真正回答问题。我们不知道他有 shell 访问权限。这应该是一条评论。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-05
        • 1970-01-01
        • 1970-01-01
        • 2011-05-05
        相关资源
        最近更新 更多