我在用着
$ xargs -n 1 curl -O < gwurls.txt
抓取一长串文件。不幸的是,我抓取的站点依赖路径来提供唯一性,因此不知道和-O
之间的区别,并破坏了文件。a/1.pdf
b/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.pdf
和b/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
。