我使用带有列表的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?
答案 0 :(得分:0)
经过多次反复试验,我最终得到了它。
我写了一个bash脚本来完成这个任务,我会写出每一行的解释。
sed -i -- 's,</Title>,.mp3,g' *.xml
sed -i -- 's,!,,g' *.xml
sed -i "s,',,g" *.xml
sed -i 's,&,And,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
#!/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')
工作原理:
sed
sed
搜索&#39;标题&#39;和&#39; Url&#39;标记并删除所有不需要的字符,只留下值。它还通过F
选项获取当前文件的名称:
F - 打印出当前输入文件的文件名(带尾随 换行)。
sed
输出管道输出到第二个sed
。它将每三行合并为一行。 filename.xml,songname.mp3,url连接到一行并用空格分隔。while
循环。while
循环逐一取行并用空格分割(这就是为什么文件名不应该包含空格,它会将我们的项目计入行中)。 read
命令用于此目的。while
循环内部 - 它会从文件名中删除不需要的内容并获取发言人姓名。如果它不存在,则在主目录中创建此发言者的目录(我们在步骤1中创建)。通过wget
程序将所有发言人的文件下载到那里。