假设我有一个 .txt 文件,其中有我要下载的图像链接列表。例子:
image.jpg
image2.jpg
image3.jpg
我用的是:cat images.txt | xargs wget
而且效果很好
我现在要做的是提供另一个具有以下格式的 .txt 文件:
some_id1 image.jpg
some_id2 image2.jpg
some_id3 image3.jpg
我想要做的是分割 ' ' 中的每一行,下载右侧的链接,然后使用左侧提供的 id 更改下载的文件名。
我想以某种方式对每个单独的行使用 wget image.jpg -O some_id1.jpg 。
所以输出将是:
some_id1.jpg
some_id2.jpg
some_id3.jpg
有任何想法吗 ?
答案1
这可能会完成你的工作,
while read a b
do
wget "$b" -O "$a".jpg
printf "$a".jpg"\n%s" >> newfile
done < images.txt
答案2
去测试:
$ awk '{ ext=gensub(/.*(\.[^.]*$)/,"\\1",1);
print "wget " $2 " -O " $1 ext}' images.txt
wget image.jpg -O some_id1.jpg
wget image2.jpg -O some_id2.jpg
wget image3.jpg -O some_id3.jpg
要运行,请输入管道bash
或sh
像这样:
awk '{ ext=gensub(/.*(\.[^.]*$)/,"\\1",1);
print "wget " $2 " -O " $1 ext}' images.txt |
bash
如果需要,请在 print 语句中添加单引号(例如,如果字段由制表符分隔,并且字段可能包含空格或其他对 shell 造成问题的字符。或者如果字段 2 是带有 & 符号&
、分号;
等的完整 URL)。例如
awk '{ ext=gensub(/.*(\.[^.]*$)/,"\\1",1);
print "wget '\''" $2 "'\'' -O '\''" $1 ext"'\''"}' images.txt
wget 'image.jpg' -O 'some_id1.jpg'
wget 'image2.jpg' -O 'some_id2.jpg'
wget 'image3.jpg' -O 'some_id3.jpg'
顺便说一句,这就是在单引号字符串中嵌入单引号的方法:('\''
结束单引号,反斜杠转义的单引号,再次开始单引号)
额外信息:
1.如果 $2 可能包含一个或多个撇号,则您可能需要在语句之前$2
(使用 awkgsub()
函数)进行额外处理。print
例如
gsub(/'\''/,"'"'\\\\''"'",$2);
单引号、双引号、斜杠和反斜杠的几乎难以阅读的混乱将'
第二个字段中的所有 s 转换为'\''
.有时引用确实很痛苦(尽管在脚本中它不会像#!/usr/bin/awk -f
单引号的单行那样难看)。
2. 或者,如果$2
是 URL,则可能值得将单引号更改为%27
,这是撇号的 URL 实体编码。 shell 不关心 % 符号,当然也不关心它们是否在单引号内,但它非常关心引号。
同样,您可能希望在提取 .扩展名时排除所有标点符号。例如
ext=gensub(/.*(\.[^[:punct:]]*)/,"\\1",1);
但请注意,这可能会变得相当复杂,具体取决于图像文件名嵌入的位置和方式,例如 URL。
答案3
使用 awk:
awk '{split($2, p, "."); system(sprintf("wget -O %s.%s %s\n", $1, p[length(p)], $2))}' images.txt
分解
首先我们使用 awk 大致打印出我们想要的命令:
awk '{printf("wget -O %s %s\n", $1, $2)}' images.txt
然后我们通过将 URL 拆分为“.”来提取扩展名。并将其附加到第一个参数:
awk '{split($2, p, "."); printf("wget -O %s.%s %s\n", $1, p[length(p)], $2)}' images.txt
最后,我们将 printf 更改为 sprintf,并将 wrap 放在系统命令中,以使 awk 执行该命令:
awk '{split($2, p, "."); system(sprintf("wget -O %s.%s %s\n", $1, p[length(p)], $2))}' images.txt