Bash,wget从输出文件名中删除逗号

3
我正在逐行读取一个包含URL的文件,然后将URL传递给wget:
FILE=/home/img-url.txt
while read line; do
url=$line
wget -N -P /home/img/ $url
done < $FILE

这个方法是有效的,但是一些文件名包含逗号。我该如何在不包含逗号的情况下保存该文件?

例如:

http://xy.com/0005.jpg -> saved as 0005.jpg
http://xy.com/0022,22.jpg -> save as 002222.jpg not as 0022,22

我希望您觉得我的问题很有趣。
更新:
我们有一些不错的解决方案,但有没有解决时间戳错误的方法?
WARNING: timestamping does nothing in combination with -O. See the manual
for details.

2
使用“-O”指定输出文件名。wget http://example.com -O foo.txt - Marc B
如果您对下载的文件进行任何更改,时间戳将不会被保留,文件将获得当前时间戳。 - Jahid
@Jahid 谢谢,很高兴知道这个。 - Adrian
3个回答

1
在循环体中,您需要从URL生成不带逗号和URL前缀的文件名,并告诉wget以其他名称保存。
url=$line
file=`echo $url | sed -e 's|^.*/||' -e 's/,//g'`
wget -N -P /home/image/dema-ktlg/ -O $file $url

1
这应该可以工作:

url="$line"
filename="${url##*/}"
filename="${filename//,/}"
wget -P /home/img/ "$url" -O "$filename"

同时使用-N和-O会提示警告信息。wget手册表示:

-N(用于时间戳检查)与-O不兼容:因为文件总是新创建的,它将始终具有非常新的时间戳。

因此,当您使用-O选项时,实际上会创建一个带有新时间戳的新文件,因此-N选项变得无效(无法做到它的目的)。如果您想保留时间戳,则解决方法可能是这样的:

url="$line"
wget -N -P /home/img/ "$url"
file="${url##*/}"
newfile="${filename//,/}"
[[ $file != $newfile ]] && cp -p /home/img/"$file" /home/img/"$newfile" && rm /home/img/"$file"

0

与此同时,我写了这个:

url=$line
$file=`echo ${url##*/} | sed 's/,//'`
wget -N -P /home/image/dema-ktlg/ -O $file $url

看起来运行良好,我的代码有什么微不足道的问题吗?


1
没关系,你应该考虑练习使用 $() 而不是反引号。我也编辑了我的帖子,逗号部分缺失了。 - Jahid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接