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文件。有任何想法吗?
要完成“如果文件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 命令)或文件名包含空格(它会破坏阻止列表,可能会给你和额外的文件,并且(不太可能)丢失文件)。两者都是可以修复的。
请注意,拒绝列表中多余的逗号会产生有趣的结果。
(见下方评论)
获取 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)
我测试了这是否适用于名称中的空格。
| 归档时间: |
|
| 查看次数: |
3854 次 |
| 最近记录: |