如何阻止 cURL 覆盖下载的文件

如何阻止 cURL 覆盖下载的文件

我在用着

$ xargs -n 1 curl -O < gwurls.txt

抓取一长串文件。不幸的是,我抓取的站点依赖路径来提供唯一性,因此不知道和-O之间的区别,并破坏了文件。a/1.pdfb/1.pdf

有没有简单的方法解决这个问题?

答案1

有几种方法:

  • 执行umask 222(或者umask 277,如果您的 umask 当前为 77;即,将 umask 加 200)。这将导致您创建的所有文件都受到保护r--(任何) 代替rw-(任何),因此,一旦您创建了一个文件,您就不应该在未chmod先执行 的情况下覆盖它(除非您以 root 身份运行)。这回答了您在标题中提出的问题,但并没有真正解决您的问题;它只是意味着您将成功下载并保留a/1.pdf并错过b/1.pdf,而不是相反。(如果有任何安慰,您会收到提醒您冲突的错误消息。)
  • 问题似乎出在你的gwurls.txt文件中,该文件天真地列出了a/1.pdfb/1.pdf,因此请尝试在那里修复它。将其改成sed或 ,使其看起来像
  pdf/1.pdf pdf_1.pdf
  b/1.pdf b_1.pdf

然后编写一个curl以 的 URL$1和 的输出规范运行的脚本$2,并运行

  xargs -n 2你的脚本< modified_gwurls.txt

所以xargs会运行

你的脚本  a/1.pdf  a_1.pdf
你的脚本  b/1.pdf  b_1.pdf

如果任何文件名中包含空格,情况就会变得混乱 —— 但我猜对于 URL 来说这是不可能的,是吗?

答案2

获得

目前最简单的解决方案是安装 Wget并执行以下命令:

wget --input-file=gwurls.txt

如果已存在同名文件,Wget 会自动重命名输出文件。

重命名

http://example.com/如果您从 URL 中删除方案和主机(例如),则可以将所有斜线替换为下划线(或任何其他字符),然后以此方式保存文件。为了安全起见,您可以将预先存在的下划线替换为双下划线。

使用 bash ,这应该可以工作:

while read -r URL; do
    OUTPUT="${URL#http://example.com/}"
    OUTPUT="${OUTPUT//_/__}"
    OUTPUT="${OUTPUT//\//_}"

    curl --output "$OUTPUT" --url "$URL"
done < gwurls.txt

怎么运行的:

  • while read -r URL; do ... done < gwurls.txt读取内容gwurls.txt逐行并将整行(不带前导或尾随空格)存储到变量中网址并执行...

  • 这三个OUTPUT=...命令使用以下方法执行上述替换Bash 字符串操作

  • curl --output "$OUTPUT" --url "URL"下载文件并以所需的文件名存储。

目录结构

也可以使用类似的方法重新创建服务器的目录结构。

使用 bash ,这应该可以工作:

while read -r URL; do
    OUTPUT="${URL#http://example.com/}"

    curl --create-dirs --output "$OUTPUT" --url "$URL"
done < gwurls.txt

在这里,--create-dirs开关使 cURL 创建目录a,如果输出a/1.pdf

相关内容