wget - if / else 下载条件?

Kai*_*Kai 3 bash download batch wget filetype

如果文件具有相同的基本名称,我希望 wget 更喜欢某种文件类型而不是另一种文件类型。

例如:

如果foo.ogg可用,请不要下载foo.mp3


到目前为止,我使用 wget 抓取/自动下载的方式(如果有人感兴趣):

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.ogg,.mp3 http://www.foo.com/folder/
Run Code Online (Sandbox Code Playgroud)

但这当然让我得到 .mp3 和 .ogg文件。有任何想法吗?

  • (语法-解释
    :-D:仅从此域
    下载 -I:仅从域的此子文件夹下载
    -r:递归(遵循链接和目录结构)
    -l 1:仅遵循 1 个链接深度
    -nc:无破坏 = 下载仅当文件不存在时
    -A:仅接受/下载所有 *.ogg 和 *.mp3(丢弃必要的 html 文件)
    (-i(可选在 URL 前面):从 URL 读取 URL,但也下载其他像 .png 之类的文件类型,您一开始不想要/之后丢弃它们)

Ero*_*oen 6

单个文件

要完成“如果文件x存在,则下载它;否则下载文件y ”,您可以执行以下操作:

wget x || wget y
Run Code Online (Sandbox Code Playgroud)

如果x存在,则下载并wget返回true,因此跳过第二部分。如果x不存在,则wget返回一些错误代码(可能是 8)并计算表达式的第二部分(下载y)。

递归地

不过,这显然对您的递归下载没有太大帮助。如果wget有设施来适应这种复杂程度的掩蔽,我会感到惊讶。手册页似乎也没有涵盖任何形式的花哨条件。不过,稍微修改的方法可能会奏效。

(似乎很难说服wget生成它想要下载的东西的列表。我的第一个想法是创建它并在下载之前对其进行适当的过滤,就像@utkuerd 建议的那样。)

一个起点自然是首先下载所有 ogg 文件,大概是

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.ogg -i http://www.foo.com/folder/
Run Code Online (Sandbox Code Playgroud)

然后可以通过相同的方法下载剩余的 mp3 文件,前提是您有合适的掩码以--reject列表形式提供。此列表应包含您不想下载的每个 mp3 文件的名称。

假设我建议您按如下方式创建此列表

bl=($(find ./ -name '*.ogg' -exec basename -s .ogg {} \+ | sed 's/\(^.\+$\)/\1.mp3/' ) )
Run Code Online (Sandbox Code Playgroud)

您现在有一个 bash 数组要阻止的 mp3 文件。

要仅下载未阻止的 mp3 文件,您可以使用

IFS=','; wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.mp3 -R"${bl[*]}" -i http://www.foo.com/folder/; unset IFS
Run Code Online (Sandbox Code Playgroud)

IFS必须修改该变量,以便列表不会被空格分隔。

显然,如果 ogg 文件列表长于getconf ARG_MAX(它会破坏 wget 命令)或文件名包含空格(它会破坏阻止列表,可能会给你和额外的文件,并且(不太可能)丢失文件)。两者都是可以修复的。

请注意,拒绝列表中多余的逗号会产生有趣的结果。

写@Bob 的绝妙建议

(见下方评论)

获取 ogg 文件后

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.ogg -i http://www.foo.com/folder/
Run Code Online (Sandbox Code Playgroud)

你可以像这样创建虚拟的mp3文件

find ./ -name '*.ogg' | sed 's/ogg$/mp3/' | xargs -d '\n' touch 
Run Code Online (Sandbox Code Playgroud)

并使用(利用-nc)获取剩余的 mp3 文件

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.mp3 -i http://www.foo.com/folder/
Run Code Online (Sandbox Code Playgroud)

然后可以使用类似的东西删除多余的 mp3 文件

find ./ -name '*.mp3' -size 0 -exec rm '{}' \+
Run Code Online (Sandbox Code Playgroud)

我测试了这是否适用于名称中的空格。

  • 我有点在想“Windows批处理文件”的方式,但是不可能(而不是指定拒绝列表,并且因为指定了`-nc`)下载所有`ogg`文件,遍历它们所有`触摸具有相同名称(0字节)的`mp3`文件,使用`-nc`下载所有作为`mp3`的文件,导致那些作为`ogg`存在的文件和相应的0字节`mp3`被跳过,然后循环遍历`ogg`s 以删除它们的mp3 版本(或者只是删除所有0 字节的`mp3`s)。拒绝列表可能更好,尽管这将完全避免“ARG_MAX”和空格问题。 (2认同)