![使用一个命令运行一个充满 .sh 文件的目录](https://linux22.com/image/1089719/%E4%BD%BF%E7%94%A8%E4%B8%80%E4%B8%AA%E5%91%BD%E4%BB%A4%E8%BF%90%E8%A1%8C%E4%B8%80%E4%B8%AA%E5%85%85%E6%BB%A1%20.sh%20%E6%96%87%E4%BB%B6%E7%9A%84%E7%9B%AE%E5%BD%95.png)
我有一个目录,里面有很多 .sh 文件,运行这些文件时,都会打开一个终端并开始下载 youtube-dl。由于文件太多,我希望找到一种方法来同时激活它们,立即打开几个不同的终端,而不是单独执行它们。我对编程还很陌生,所以我不太确定如何做到这一点,以及我是否可以创建一个脚本来运行它们,使用命令等。任何帮助都非常感谢,谢谢。
答案1
虽然你确实可以运行所有.sh
for 循环运行目录中的所有文件,但建议Yaron 说,这确实是一种过于复杂的方法。如果它们之间的唯一区别是它们将下载的 RL,就不要编写太多脚本!而且也没有理由为每个脚本生成一个终端窗口!
相反,将您的 YouTube URL 写入文件中,每行一个:
http://youtube.com/foo
http://youtube.com/bar
http://youtube.com/baz
然后,要下载它们,请使用(file
是带有 URL 的文件名):
while read url; do
youtube-dl "$url"
done < file
这将逐个下载文件中的每个视频。如果您想同时下载所有视频(如果视频太多,这不是一个好主意),您可以通过添加以下内容在后台运行每个下载命令&
:
while read url; do
youtube-dl "$url" &
done < file
答案2
请注意,这些文件应该是可执行的 - 您可能需要在
.sh
运行上述脚本之前在保存文件的目录中执行以下命令:chmod +x *.sh
以下脚本将获取所有以 结尾的文件.sh
并执行它们。
#/bin/bash
for shfile in *.sh
do
./$shfile
done
您可以将上述行(不包括第一行#/bin/bash
)复制/粘贴到您的终端中,这样就可以了(感谢@terdon 的评论)。
您可以将该脚本保存在其他文件夹中(例如/tmp/execute_all.sh
,使用以下命令使其可执行:
chmod +x /tmp/execute_all.sh
然后进入包含.sh
文件的目录并使用以下命令执行脚本:
/tmp/execute_all.sh
该脚本将尝试执行所有以以下内容结尾的文件.sh
答案3
我遇到过一些视频网站不太稳定的情况,我不得不多次重试下载。GNU Parallel 可以做到这一点:
cat urls.txt | parallel --retries 50 --timeout 1000% --joblog +my.log youtube-dl
这将在每个 CPU 核心上运行一个作业,如果下载失败,则尝试 50 次。它将终止比平均运行时间长 10 倍的作业(例如,如果下载卡住了)。它还将附加到文件中,my.log
以便您可以查看每个作业的状态。
答案4
您可以使用命令行实用程序run-parts
。它运行目录中的所有脚本。
如何调用:
run-parts [--test] [--verbose] [--debug] [--report] [--lsbsysinit]
[--regex=RE] [--umask=umask] [--arg=argument] [--exit-on-error]
[--help] [--version] [--list] [--reverse] [--] DIRECTORY
方括号表示可选参数。请勿键入它们。只有一个参数是必需的:DIRECTORY
。大多数情况下,不需要其他参数。
页面描述man
:
run-parts
运行目录中约束范围内的所有可执行文件DIRECTORY
。其他文件和目录将被忽略。