我在以字母“a”开头的目录中有许多 shell 脚本。我如何一次性执行所有这些 shell 脚本?我们可以开发任何其他小脚本来运行它吗?
答案1
命令行:
for each in path_to_directory/a*.sh ; do bash $each ; done
例子:
:~$ ll | grep \.sh
-rw-rw-r-- 1 user user 1476 Май 25 16:07 123.sh
-rw-rw-r-- 1 user user 1176 Май 25 16:09 222.sh
-rw-rw-r-- 1 user user 419 Май 20 14:03 2.sh
-rw-rw-r-- 1 user user 191 Май 20 17:50 3.sh
-rw-rw-r-- 1 user user 9 Июн 2 11:53 a1.sh
-rw-rw-r-- 1 user user 9 Июн 2 11:53 a2.sh
i:~$ cat q1.sh
echo sadf
:~$ cat a1.sh
echo 123
:~$ cat a2.sh
echo 234
:~$ for each in ./a*.sh ; do bash $each ; done
123
234
或者您可以使用名为 run-parts 的命令行实用程序。该工具可以自动发现一个目录中的多个脚本或程序,并全部运行它们。
例如,要运行 /etc 中名称以“a”开头并以“.sh”结尾的所有脚本:
$ run-parts --regex '^a.*\.sh$' /etc
使用“--test”选项,您可以打印将要执行的脚本的名称,而无需实际运行它们。这对于测试目的很有用
$ run-parts --test ./my_script_directory
答案2
find . -maxdepth 1 -type f -perm /111 -name 'a*' -exec {} \;
或者
find . -maxdepth 1 -type f -executable -name 'a*' -exec {} \;
其中任何一个都会a
在当前目录(但不是子目录)中找到所有以 开头的文件名,并且设置了所有者、组或其他执行位,然后尝试运行它们。
我说“尝试”是因为尝试可能会失败,例如,如果仅设置了所有者和组执行位并且您既不是该组的所有者也不是该组的成员。在这种情况下,您将无权执行该文件。
另一种可能的失败模式是它只能执行当前 shell 可以解释的脚本。因此以awk
或perl
开头的脚本将a
无法运行 - 它将因语法错误而失败,因为它们不是 shell 脚本。
另一种方法是:
for f in ./a* ; do [ -x "$f" ] && [ ! -d "$f" ] && "$f" ; done
它将执行以a
您可执行文件开头的任何内容(并且不是目录),无论它是什么类型的可执行文件 - shell 脚本、awk 脚本、perl 脚本、二进制文件等。
答案3
你可以试试这个——
for i in a*; do file "$i"|grep -q 'script' && ./"$i"; done
解释-
for i ...
- 这是一个 for 循环,它将迭代以 a 开头的每个项目。file "$i"|grep ...
文件命令显示文件的类型。这是必要的,因为可能还有其他以“a”开头的文件或目录。这grep寻找单词 '脚本' 在文件的输出中&& ./"$i" ...
如果搜索通过grep成功的话,就会执行脚本。