如何在 .txt 文件中使用带有许多 URL 的 wget 下载并另存为

how to use wget with Many URL's in .txt file to download and save as

我有一个 txt 文件,其中包含太多要下载的直接链接,包括每个文件前面的每个文件名 url,txt 文件如下所示:

http://example.com/file1.png name_of_the_file1
http://example.com/file2.mp4 name_of_the_file2
http://example.com/file3.mkv name_of_the_file3
http://example.com/file4.png name_of_the_file4
http://example.com/file5.avi name_of_the_file5

如您所见,文件名和 url 由 space 分隔。

我想要的是一个 linux 命令,它输入包含 url 的 txt 文件并下载每个文件,然后使用 wget.[= 将它们重命名为各自的名称14=]

请帮助我,任何帮助将不胜感激,谢谢!

注1:url和文件名

之间正好有一个space

注2:文件名可能包含spaces:见下面的例子

http://example.com/47188.png Abaixo de Zero (2021)

我能想到的最简单的事情是以下简单的 python 脚本:

import os
lines = open('<name_of_your_file>').readlines()
for line in lines:
    url, file_name = line.strip().split(' ', 1)
    os.system(f'wget {url} -o {file_name}')

如果一个人想要它在一个衬里 bash,下面的作品:

$ python -c "import os; lines = open('<name_of_your_file>').readlines(); [ os.system(f'wget {url} -o {file_name}') for url, file_name in [line.strip().split(' ', 1) for line in lines]]"

您可以使用此代码:

while IFS= read -r line; do
        IFS=' '
        read -a strarr <<< "$line"
        wget -O ${strarr[1]} ${strarr[0]}
done < filename.txt

这是一个 bash 脚本。但如果你不知道如何使用它:

  1. 将其粘贴到 file.sh
  2. 运行这条命令才能执行:chmod +x file.sh
  3. 执行:./file.sh

P.S 不要忘记更改文件名以使用包含链接的实际文件名。

你可以使用这个 awk|xargs 一行:

awk '{url=; ="";{sub(/ /,"");out=url" -O \""[=10=]"\""}; print out}' file.txt | xargs -L 1 wget

解释:

    url= # temp var inside awk
    ="" # replace url with null space
    {sub(/ /,"");out=url" -O \""[=11=]"\""} # need to output var
        sub(/ /,"") # need to trim leading white space
        out=url" -O \""[=11=]"\"" # line formatting with escaping characters
    print out # シ
    xargs -L 1 wget # get awk output line by line to wget
plus some awk sintax sugar

示例:

cat << EOF >> file.txt
https://www.openssl.org/source/old/1.1.1/openssl-1.1.1k.tar.gz name_of_the_file2
https://www.openssl.org/source/old/1.1.1/openssl-1.1.1j.tar.gz name of_the_file3
https://www.openssl.org/source/old/1.1.1/openssl-1.1.1i.tar.gz name of the_file4
https://www.openssl.org/source/old/1.1.1/openssl-1.1.1h.tar.gz name of the file5
EOF
awk '{url=; ="";{sub(/ /,"");out=url" -O \""[=12=]"\""}; print out}' file.txt | xargs -L 1 wget
ls -1
name_of_the_file2
'name of_the_file3'
'name of the_file4'
'name of the file5'
    while IFS= read -r line; do
        IFS=' '
        read -a strarr <<< "$line"
        if [[ ${#strarr[@]} -gt 2 ]]
        then
                filename=''
                for (( i=${#strarr[@]}; i>0;  i-- ));
                do
                        filename="${strarr[i]} $filename"
                done
                wget ${strarr[0]} -O "$filename"
        else
                wget ${strarr[0]} -O ${strarr[1]}
        fi
done < filename.txt

此代码已修改,现在可以创建文件名中包含多个单词的文件。但是这段代码不是很清楚,因为我不知道 bash 脚本的所有功能。我实际上正在使用 python.