Bash脚本用于查找和执行更复杂的命令

时间:2013-01-07 10:02:45

标签: bash find exec

好的,所以我想要以下列方式执行一堆test_xxvalidate_xx个文件:

./path/test_01 | ./server | ./path/validate_01

./path/test_02 | ./server | ./path/validate_02

......等等。

现在,我想创建一个run_all脚本,它将找到所有这些其他脚本并以这种方式运行它们。

我可以使用以下代码来查找和执行,例如,test_01:

find ./*/ -name test_01 -exec {} \;

所以,我有两个问题:

  1. (重要!)如何让bash执行上面更复杂的行,使用管道和两个未知目录进行搜索?我只能找到如何执行单个命令。

  2. (不太重要,但仍然是一个问题......)循环这个脚本的最佳方法是什么,以便它执行目录中的所有测试/验证脚本,然后停止?这些脚本目前名为test_01,test_02,...,test_26(类似于validate_xx) - 但我想脚本仍然可以正常工作,如果我添加test_27等,则无需更改。

2 个答案:

答案 0 :(得分:1)

如果它们不跨越多个目录,则不需要使用find

for test in path/test*; do $test | ./server | ${test/test/validate}; done

BTW,有用的花絮:${a/b/c}语法说:获取变量a的值,并将b替换为c

如果确实需要find,那么可以在shell脚本中包装重定向:

find dir -exec sh -c '... | ... | ...' \;

编辑:更详细一点,

find . -name test\* -exec sh -c '
  test={}
  validate=${test/test/validate}
  $test | ./server | $validate
' \;

答案 1 :(得分:0)

使用for循环。例如,您可以循环测试并通过参数扩展从中提取数字:

for test in ./path/test_[0-9][0-9] ; do
    "$test" | ./server | ./path/validate_${test: -2}
done