使用一个命令运行一个充满 .sh 文件的目录

使用一个命令运行一个充满 .sh 文件的目录

我有一个目录,里面有很多 .sh 文件,运行这些文件时,都会打开一个终端并开始下载 youtube-dl。由于文件太多,我希望找到一种方法来同时激活它们,立即打开几个不同的终端,而不是单独执行它们。我对编程还很陌生,所以我不太确定如何做到这一点,以及我是否可以创建一个脚本来运行它们,使用命令等。任何帮助都非常感谢,谢谢。

答案1

虽然你确实可以运行所有.shfor 循环运行目录中的所有文件,但建议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。大多数情况下,不需要其他参数。

页面描述manrun-parts 运行目录中约束范围内的所有可执行文件DIRECTORY。其他文件和目录将被忽略。

相关内容