【发布时间】:2015-08-11 02:00:16
【问题描述】:
我正在编写一个脚本,该脚本将大约 300 个 URL 的列表作为输入,其格式如下:
http://long.domain.prefix/folder/subfolder/filename.html
在那个 URL 中,我想保存 filename.htmlin ./folder/subfolder/ - 如果该文件夹结构不存在,则必须创建它。这可行,文件夹正在写入磁盘,但没有下载文件。
我的脚本如下所示:
#!/bin/bash
for line in `cat list.txt`; do
# strips the URL prefix and trailing slash
name=${line#http://long.domain.prefix\/}
/usr/bin/curl -m 10 -f -o $name --create-dirs $fullname
done;
由于某种原因,$name 变量恰好在 74 个字符后被截断,这显然会导致 HTTP 错误代码。我无法提供确切的 URL,但请确保它们是正确的,只要使用的是完整的 URL。
如何防止这种奇怪的切断行为?
【问题讨论】:
-
URL 中的第 75 个字符是否有任何“奇怪”(如空格、分号或 & 符号)? (另请参阅 mywiki.wooledge.org/DontReadLinesWithFor 和链接页面,了解为什么
for line in $(cat list.txt)是一个坏主意。)您还应该引用变量以防止在值上出现分词、通配等问题(并避免我之前建议的问题。跨度> -
如果您将
set -x添加到脚本顶部并在循环内添加printf 'line = [%s]\nname = [%s]\n' "$line" "$name",您是否看到在curl 命令行上正确使用了url,并且printf输出了您期望的内容每个变量? -
如果您将
--trace-ascii添加到curl调用中,传出请求是否具有完整的URL,或者它是否已经被截断?在printf格式字符串中使用%q而不是%s是否显示任何控制/等。平时看不到的字符? -
这看起来不正确,请注意关闭
]和变量扩展中的\r的位置?该输入文件具有 DOS 行尾。这本身并不能解释 74 个字符的问题,尽管我不认为但不会有任何帮助。我会解决这个问题,看看你会得到什么。 -
该输出的内容中仍然包含
\r。此外,该输出将表明您的参数扩展并未按照您希望的方式从文件名中剥离域。
标签: macos bash shell curl download