WGET对应目录的多个列表

时间:2017-07-21 21:48:55

标签: xml sed grep wget

我使用带有列表的WGET来下载带有自定义名称的多个文件,并且需要将所有内容都放入自定义目录。

我从以下开始: 只有1000多个XML文件,每个文件在一个文件夹中都有一个唯一的名称,例如。 speaker1.xml,speaker2.xml等,里面有格式。 样品:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Audios>
    <Audio>
        <Title>There is More</Title>
        <Url>http://www.somewebsite.com/modules/mydownloads/visit.php?lid=22295</Url>
        <Speaker>Man Speaking</Speaker>
        <Length>36.85Mb</Length>
        <Status>NOT_STARTED</Status>
        <isSelected>false</isSelected>
    </Audio>
</Audios>

我需要解析所有这些文件,以便只保留标题,没有它的空格,扩展名为.mp3,后跟链接。

ThereisMore.mp3
http://www.somewebsite.com/modules/mydownloads/visit.php?lid=22295

我知道如何使用find / replace + RegEx,但只能在单个文件中使用。

Grep / Sed会成为我需要的吗?如果是这样,怎么样?

继续问题2,

我的最终目标是使用它来下载一个扬声器的全套mp3并给它们正确的名称:

while read url; do read filename; wget -O $filename $url; done < speaker1.xml

现在,我可以下载包含单个文件的自定义名称的所有链接,但不知道如何为多个文件完成此操作。

我需要将所有内容保存到各个目录中,并使用扬声器(或更恰当的xml文件)作为分隔符。

例如,处理speaker1.xml会将speaker1的所有mp3文件下载到名为speaker1的目录,扬声器2,3的相同内容,最多1000 +

我可以使用

将每个.xml放入相应的目录中
find . -name "*.xml" -exec sh -c 'mkdir "${1%.*}" ; mv "$1" "${1%.*}" ' _ {} \;

如果我走那条路,我怎样才能让wget遍历每个目录中的每个xml?

2 个答案:

答案 0 :(得分:0)

经过多次反复试验,我最终得到了它。

我写了一个bash脚本来完成这个任务,我会写出每一行的解释。

替换&lt; / title&gt; .mp3

sed -i -- 's,</Title>,.mp3,g' *.xml

删除!来自标题

sed -i -- 's,!,,g' *.xml

删除&#39;来自标题

sed -i "s,',,g" *.xml

删除&amp; amp;来自标题

sed -i 's,&amp;,And,g' *.xml

替换:用。在标题

sed -i -- 's,:,.,g' *.xml

恢复:http://

sed -i -- 's,p./,p:/,g' *.xml

从标题

中删除空格
sed -i -- 's, ,,g' *.xml

删除前导标题标记

sed -i -- 's,<Title>,,g' *.xml

删除前导网址标记

sed -i -- 's,<Url>,,g' *.xml

删除所有剩余的&lt;和&gt;标签和介于两者之间的所有内容

sed -i 's,<.*>,,g' *.xml

清理空格

sed -i '/^$/d' *.xml

为具有相应名称的所有文件创建一个目录,并将每个.xml文件移动到它的相应目录

find . -name "*.xml" -exec sh -c 'mkdir "${1%.*}" ; mv "$1" "${1%.*}" ' _ {} \;

wget everything

for d in ./*/ ; do (cd "$d" && while read filename; do read url; wget -O $filename $url; done < *.xml); done

删除xml文件

for d in ./*/ ; do (cd "$d" && rm *.xml); done

最终产品

#!/bin/bash
sed -i -- 's,</Title>,.mp3,g' *.xml
sed -i -- 's,!,,g' *.xml
sed -i "s,',,g" *.xml
sed -i -- 's,:,.,g' *.xml
sed -i -- 's,p./,p:/,g' *.xml
sed -i -- 's, ,,g' *.xml
sed -i -- 's,<Title>,,g' *.xml
sed -i -- 's,<Url>,,g' *.xml
sed -i 's,<.*>,,g' *.xml
sed -i '/^$/d' *.xml
find . -name "*.xml" -exec sh -c 'mkdir "${1%.*}" ; mv "$1" "${1%.*}" ' _ {} \;
for d in ./*/ ; do (cd "$d" && while read filename; do read url; wget -O $filename $url; done < *.xml); done
for d in ./*/ ; do (cd "$d" && rm *.xml); done

答案 1 :(得分:0)

检查一下。如果它执行您想要的操作,请删除所有echo命令。我把它们用于显示将要执行的命令。

警告: xml文件的名称不应包含空格。

#!/bin/bash

# change this path to your xml files directory
xml_files_dir='xml_files'
# this directory will be contain all others speaker subdirectories
dir_for_all_speakers='speakers'

# 'echo' should be removed after testing, if script do what your want.
echo mkdir -p "$dir_for_all_speakers"

while read -r filename title url; do
    speaker_dir_path="${dir_for_all_speakers}/"$(basename "$filename" '.xml')

    if [ ! -d "$speaker_dir_path" ]; then 
        echo mkdir "$speaker_dir_path"
    fi  

    echo wget -O "${speaker_dir_path}/$title" "$url"
done < <(sed -rn '
    /<Title>/ {
        s/.*>(.*)<.*/\1.mp3/; s/ //g
        h
    }
    /<Url>/ {
        s/.*>(.*)<.*/\1/;
        H; g; F; p
    }
' "${xml_files_dir}/"*.xml | sed 'N;N;s/\n/ /g')

工作原理:

  1. 制作主目录,其中将存储发言人的目录。
  2. 获取所有xml文件并将其传递给第一个sed
  3. sed搜索&#39;标题&#39;和&#39; Url&#39;标记并删除所有不需要的字符,只留下值。它还通过F选项获取当前文件的名称:
      

    F - 打印出当前输入文件的文件名(带尾随   换行)。

  4. 将第一个sed输出管道输出到第二个sed。它将每三行合并为一行。 filename.xml,songname.mp3,url连接到一行并用空格分隔。
  5. 现在,我们有1000行 - 每个xml文件一行。每行包含所有需要的数据。将它们传递给while循环。
  6. while循环逐一取行并用空格分割(这就是为什么文件名不应该包含空格,它会将我们的项目计入行中)。 read命令用于此目的。
  7. 接下来发生while循环内部 - 它会从文件名中删除不需要的内容并获取发言人姓名。如果它不存在,则在主目录中创建此发言者的目录(我们在步骤1中创建)。通过wget程序将所有发言人的文件下载到那里。