访问 .txt 文件中的每一行,下载并重命名链接

访问 .txt 文件中的每一行,下载并重命名链接

假设我有一个 .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

要运行,请输入管道bashsh像这样:

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

分解

  1. 首先我们使用 awk 大致打印出我们想要的命令:

    awk '{printf("wget -O %s %s\n", $1, $2)}' images.txt
    
  2. 然后我们通过将 URL 拆分为“.”来提取扩展名。并将其附加到第一个参数:

    awk '{split($2, p, "."); printf("wget -O %s.%s %s\n", $1, p[length(p)], $2)}' images.txt
    
  3. 最后,我们将 printf 更改为 sprintf,并将 wrap 放在系统命令中,以使 awk 执行该命令:

    awk '{split($2, p, "."); system(sprintf("wget -O %s.%s %s\n", $1, p[length(p)], $2))}' images.txt
    

相关内容