如何在Linux中的目录中运行所有脚本

时间:2020-03-21 11:44:54  来源:igfitidea点击:

在Linux运行目录中的所有脚本

我在我的文档目录中有几个脚本。

$ls Documents/
linux.sh theitroad.sh script1.sh script2.sh script3.sh script4.sh

所有这些都是简单的单行shell脚本,它在标准输出中使用"echo"命令显示给定的字符串。

在我知道之前,我们可以在文件夹中运行所有脚本,我通常会使脚本可执行,如:

$chmod +x script.sh

然后我使用命令运行它:

$./script.sh

或者,

$sh script.sh

同样,我让第二个脚本可执行并运行它等等。

好吧,你不需要这样做。
我们可以使用"run-parts"命令在目录或者路径中运行所有脚本。
运行零件命令用于在目录或者路径中运行脚本或者程序。

$run-parts <directory-path>

run-parts命令的一个缺点是它不会执行所有脚本。
只有当脚本具有正确的名称时,它只工作。
名称必须完全由ASCII大写和小写字母,ASCII数字,ASCII下划线和ASCII减去连字符组成。

要解决此命名问题,我们可以使用Regex选项。
例如,以下命令将在~/documents目录中查找并运行以字母's'开头的所有脚本文件,并以'sh'扩展为止:

$run-parts --regex '^s.*sh$' ~/Documents

故障排除:

如果我们遇到错误的错误;

run-parts: failed to exec Documents/script1.sh: Exec format error

同样,要运行以文档目录中的.sh结尾的所有脚本文件,请运行:

$run-parts --regex '.*sh$' ~/Documents

要打印以字母's'开头的文档目录中所有文件的名称,并以'sh'扩展为止,运行:

$run-parts --list --regex '^s.*sh$' Documents
Documents/script1.sh
Documents/script2.sh
Documents/script3.sh
Documents/script4.sh

此命令仅打印脚本文件的名称,但不会执行它们。

要列出所有文件以文档目录中的.sh结尾,请运行:

$run-parts --list --regex '.*sh$' Documents
Documents/linux.sh
Documents/theitroad.sh
Documents/script1.sh
Documents/script2.sh
Documents/script3.sh
Documents/script4.sh

run-parts命令主要由Cron作业使用,并且对于手动使用不可靠。

另一种避免处理重命名脚本以适应运行零件的命名结构的另一种方法,可以使用查找或者循环命令。

要查找并运行以~/documents文件夹中以字母"s"开头的所有脚本文件,请运行:

$find ~/Documents -maxdepth 1 -type f -executable -name 's*' -exec {} \;

如果要在给定的目录和所有子目录中运行所有脚本,请在上面的命令中删除maxdepth选项:

$find ~/Documents -type f -executable -name 's*' -exec {} \;

运行以扩展名".sh"结尾的所有脚本,运行:

$find ~/Documents -maxdepth 1 -type f -executable -name '*.sh' -exec {} \;

该方法也具有轻微的缺点。
此命令只能运行当前shell可以解释的脚本。
如果要运行所有类型的脚本,例如awk,perl,python,shell脚本,则使用下面的循环方法使用。

$for f in ~/Documents/s* ; do [ -x "$f" ] && [ ! -d "$f" ] && "$f" ; done

上面的命令将运行以~/文档文件夹中的字母"s"开头的脚本。
如果要运行以".sh"扩展以结尾的所有文件,请执行以下操作:

$for f in ~/Documents/*.sh ; do [ -x "$f" ] && [ ! -d "$f" ] && "$f" ; done

有关更多详细信息,请参阅Man页面。

$man run-parts
$man find