【问题标题】:How to rename a wget output, to a name inside a file(bash)如何将 wget 输出重命名为文件中的名称(bash)
【发布时间】:2018-03-15 01:02:14
【问题描述】:
#!/bin/bash

for i in `cat pdfs.txt`
do 

wget --waitretry=1 --read-timeout=20 --timeout=15 -c -O $i > `cat pdfsnaming.txt`

done

我正在使用 wget 抓取 pdf 文档列表,我想将它们重命名为文本文档“pdfsnaming.txt”的内容。我知道您将 wget 重命名为-(大写 O 已确认)

wget-O $i > foo.tag

pdfsnaming.txt- 里面有大约 500 个名字,有的有空格,有的没有; -没有报价 (例如:JohnDoe)例如:John Doe)

nameone
nametwo
namethree
name spaced
namefour
name spaced2

pdfs.txt- 包含网址仅供参考,没有引号

错误结果/下载的文件名--

--waitretry=1

它把它命名为第一个全字 WGET 标记??

在实验上我猜这可以用一个数组来完成?但随之而来的问题是这将是一个巨大的数组,我必须添加单独的代码来添加引号和括号等等等。更不用说引号必须不会导致这种情况(例如:“name”“spaced” )。

while read -a arr;
do wget --waitretry=1 --read-timeout=20 --timeout=15 -t 1 -cO 
"${arr[0]}".pdf "${arr[1]}" 
done < <(paste -d'\1' pdfsnaming.txt pdfs.txt)

调试代码

【问题讨论】:

  • 您正在尝试从 pdfsnaming.txt 中逐行读取文件名?
  • 是的,我希望循环中的每个 wget 输出都以 pdfsnaming.txt 中的名称命名,位于列表下方。
  • paste 是类似于压缩的命令。你想看看那个。
  • 名称中有空格吗?它们是如何划分的?
  • 是的,例如,例如。 John Doe,而有些就像前任一样。约翰多

标签: linux bash shell loops wget


【解决方案1】:

这是一个有趣的问题。正如我评论的那样,您确实可以使用paste 来处理它。

$ cat pdfs
a
b
c
d
$ cat names
aa
b b
cccc
d d d d

paste 为您提供压缩输出:

$  paste -d'\1' pdfs names
aaa
bb b
ccccc
dd d d d

-d 表示分隔符,选择 '\1' 作为分隔符,因为它不可打印,因此您不太可能在此应用程序中遇到问题。

那么剩下的就是例行公事了:

$ IFS='\1'
$ while read -a arr; do echo pdf is "${arr[0]}", name is "${arr[1]}"; done < <(paste -d'\1' pdfs names)
pdf is a, name is aa
pdf is b, name is b b
pdf is c, name is cccc
pdf is d, name is d d d d

您需要设置IFSread 知道您自定义的分隔符。您可以通过取消设置来恢复。

$ unset IFS

【讨论】:

  • ": 不是任意的:这个字符不能出现在文件名中" - 它可以。
  • @Dzienny 让我彻底解决这个问题。
  • @Dzienny 我虽然'\0' 会工作,但它不会。无论如何,不​​可打印的字符有很多选择。
  • 但是你如何用 wget 应用这个?
  • 您只需将$i 插入${arr[0]} 并将文件名插入${arr[1]},两者都带有引号。
猜你喜欢
  • 1970-01-01
  • 2021-02-17
  • 2012-03-25
  • 2015-08-12
  • 2016-09-23
  • 2017-12-12
  • 1970-01-01
  • 2014-02-22
  • 2019-05-02
相关资源
最近更新 更多