【问题标题】:Batch FTP mget command not working with wildcard?批处理 FTP mget 命令不能使用通配符?
【发布时间】:2013-05-13 16:00:20
【问题描述】:

我编写了一个批处理脚本,它登录到我的 ftp 服务器,然后导航到一个目录。我在使用 mget 命令时遇到问题,我希望它下载目录中的每个 .dat 文件,但它只是返回此错误:

Cannot access file '/home/minecraft/multicraft/servers/server267/world/players/*.dat':No such file or directory.
200 Type set to: ANSI
Cannot find list of remote files

这是我的脚本(从 cmd 运行)

open 66.71.244.202
USER
PASSWORD
cd /world
cd players
mget *.dat

【问题讨论】:

  • 手动运行命令而不是从批处理文件运行命令是否有效?
  • 你能在那个目录中列出你的目标文件吗?
  • 与 Rob 的问题一样,您可以 GET 任何 1 个 .dat 文件。如果您可以列出目录内容并且可以GET 任何一个文件,则可以动态构建脚本以对所有.dat 文件使用GET。如果两者都做不到,则说明您在 FTP 服务器上没有适当的权限。
  • 我可以列出文件,也可以获取单个文件。它只是不喜欢*。我将如何做这种动态的事情?

标签: windows batch-file


【解决方案1】:

这是设计使然。 FTP 规范 (RFC 3659) 的最新更新明确禁止它(参见第 2.2.2 节):

For the commands defined in this specification, all pathnames are to be treated literally. That is, for a pathname given as a parameter to a command, the file whose name is identical to the pathname given is implied. No characters from the pathname may be treated as special or "magic", thus no pattern matching (other than for exact equality) between the pathname given and the files present in the NVFS of the server-FTP is permitted.

Clients that desire some form of pattern matching functionality must obtain a listing of the relevant directory, or directories, and implement their own file name selection procedures.

【讨论】:

    【解决方案2】:

    当您使用 ftp 执行脚本文件时,您必须关闭通配符,这将允许在脚本中使用通配符。例如:

    ftp -n -i -s:scriptfile.txt 
    

    应该可以,但是

    ftp -n -i -g -s:scriptfile.txt
    

    不会。

    【讨论】:

    • 这并没有解决问题——他说即使在命令行中,mget 仍然无法工作,而不是在脚本中。
    【解决方案3】:

    我知道这是旧的,但它可能会帮助某人。我在来自 Windows FTP 的 MGET 上使用通配符时遇到了同样的问题,但不一致的是它可以与 一些 远程系统通信,但不能与 所有 系统通信。

    我的脚本是这样做的:

    cd /folder/folder
    mget ./-400TA/folder/*_XYZ
    

    在文件夹结构中,我有一组以连字符开头的不同文件夹,无论出于何种原因,脚本 CD 都位于该文件夹的上方,并使用 MGET 中的相对路径。我遇到了与你们中的一些人报告的相同的问题,如果我以交互方式连接并一一键入命令,它就可以工作。但在批量中,它没有。

    我遵循了这篇文章和其他帖子中的建议,但并不高兴。我目前无法访问远程系统来查看它们以找出为什么有些工作而有些没有。

    但是,我确实找到了这个。更改我的脚本如下:

    cd /folder/folder/-400TA/folder
    mget *_XYZ
    

    成功了。简单的。在某个地方发生了一些奇怪的交互,可能与文件夹保护或其他东西有关,但这只是表明尝试不同的东西最终可能会让你到达那里。

    【讨论】:

    • 我正在这样做,但我发现它只拉入一个文件,而不是所有匹配的文件。
    【解决方案4】:

    我会确保 glob 已打开,当关闭时,put 和 get 命令中的文件名按字面意思使用,并且不会查看通配符。

    更多信息:

    glob:为 mdelete、mget 和 mput 切换文件名扩展。如果通配符 使用 glob 关闭,文件名参数按字面意思获取 并且没有展开。 mput 的 globbing 在 csh 中完成。对于 mdelete 和 mget,每个远程文件名在远程单独展开 机器和列表不合并。目录名的扩展是 可能不同于普通文件名的扩展: 具体结果取决于国外操作系统和ftp 服务器,并且可以通过执行'mls remote-files -'来预览 注意:mget 和 mput 并不意味着传输文件的整个目录子树。 这可以通过传输子树的 tar 存档来完成(在 二进制模式)。

    进入 ftp 后,请尝试检查 glob,如果它关闭则将其打开。默认行为是打开的,当使用选项-g 连接到 ftp 时,您可以从命令行关闭文件名通配。

    【讨论】:

      【解决方案5】:

      也很可能是防火墙问题,它不允许或转发服务器的入站连接。发生在我身上。

      【讨论】:

      • 欢迎来到 SO!这是一个不太可能的猜测——尤其是因为提问者已经接受了不同的答案。 SO 不是一个讨论论坛——即使有时看起来是这样。我们尽量让答案严格针对问题的主题。这可能是对问题的评论(如果还没有接受的答案)。一旦你有更多的声誉,你就可以评论其他人的帖子。在此之前,请专注于提出好的问题并为问题提供有价值的好答案。请参阅帮助页面。干杯!
      • 我遇到了完全相同的错误,它是由防火墙引起的 - 这怎么不是答案?将特定问题的所有答案放在一个问题下不是更有用吗?
      • 是的。如果他们回答这个问题。恕我直言,这个特殊的问答对是一个边缘案例。根据经验,如果已经有一个接受的答案,我会谨慎添加答案。在这里,作者已经明确评论他可以获取单个文件。所以你的答案显然不能解决这个特定的问题。我们可以争辩说这个问题措辞不当,或者 cmets 可能应该是对问题的编辑。
      • 仅供参考,我也可以获取单个文件!我的意图是扩展该主题,以便对其有相同问题的其他人有用。如果这是 SO 中不需要的东西,我可以将其删除或转换为评论
      • 我看不出防火墙规则如何允许我获取一个文件而不是多个文件。
      猜你喜欢
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      相关资源
      最近更新 更多