【问题标题】:Wildcard in URL while using wget使用 wget 时 URL 中的通配符
【发布时间】:2020-08-04 06:13:40
【问题描述】:

我正在尝试使用以下 Wild 命令通过 shell 将整个文件从 S3 复制到 HDFS:

wget https://export.xyz.com/Disabilities/*/*/*/*_0620.csv.zip 

我收到错误:ERROR 404: Not Found 当我使用一个特定文件的 URL 时,可以复制。

请告诉我如何在 URL 中使用通配符。

【问题讨论】:

  • 如果你*真的 *会以与你发布命令完全相同的方式在shell中键入命令,shell会写一个错误消息,例如No such文件或目录,因为它会尝试将您的通配符与您的文件系统进行匹配。另外,我不清楚在 URL 中使用通配符是什么意思,即你期望 wget 对包含星号的 URL 做什么。它当然可以将其转发到网络服务器,但是,网络服务器应该怎么做呢?
  • @user1934428 下载一个文件的命令是“wget export.xyz.com/Disabilities/state/city/MMYY/file_0620.csv.zip”,但我需要下载所有州、所有城市和所有月份,所以我用*。
  • 我对@9​​87654324@ 没有太多经验,但是您从哪里得出结论,您可以在https URL 中使用通配符?我发现在 wget 手册中使用通配符的唯一可能性是使用 ftp URL。也许你有兴趣做一个recursive download

标签: shell wildcard wget


【解决方案1】:

你不能。使用通配符仅适用于已知所有可能性的情况:

  • 在 shell 中,操作系统已经知道目录中的所有文件:发出 ls *.log 仅有效,因为这可以匹配所有出现的文件名。
  • 在 SQL 中,DBMS 已经知道所有表列和表的所有数据行:发出 SELECT * FROM people WHERE name LIKE '%Rogers' 仅在所有表的列名都可用并且过滤器可以与所有存在的行匹配时才有效。李>
  • 在正则表达式中,要操作的文本已经是需要知道的所有内容:搜索 p+ 只能工作,因为它的部分可以匹配,即 opposing forces

统一资源定位器 (URL) 永远不能有通配符,因为那样它就不再统一了。 WGET(或任何其他 HTTP 客户端)应该如何知道哪些可能性可以填充到潜在的通配符占位符中?更不用说知道* 是指通配符而不是URI 的文字部分?您基本上是在询问“互联网中存在哪些 URL”,我想知道您期望哪个答案。

你必须想出所有排列你自己,即 WGET 可以处理的所有 URL 的列表:

https://export.xyz/Disabilities/NY/NYC/0620/file_0620.csv.zip
https://export.xyz/Disabilities/NY/NYC/0720/file_0620.csv.zip
https://export.xyz/Disabilities/NY/NYC/0820/file_0620.csv.zip

毫无疑问,这个列表可能非常大,并且包含确实不存在的 URL(从逻辑上讲永远不会存在),因为它会简单地显示为 HTTP 状态 404 - 您将浪费的只是一点点流量和时间。

【讨论】:

    【解决方案2】:

    wget -r --no-parent -A '*_0620.csv.zip' https://export.xyz.com/Disabilities/

    可能有效,我不是 100% 确定。 -A 设置可接受参数的列表,您可能还必须接受目录模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 2012-10-03
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      相关资源
      最近更新 更多