我需要浏览大量文件,我在这样的bash脚本中执行此操作:
#! /usr/bin/env bash
REX="word"
grep -IP $REX A* >> result &
grep -IP $REX B* >> result &
grep -IP $REX C* >> result &
grep -IP $REX D* >> result &
[..]
如何知道所有流程何时完成?
答案 0 :(得分:4)
使用bash内置'wait'
等[n ...]
等待每个指定的进程并返回其终止状态。每个n可以是进程ID或作业规范;如果给出了作业规范,则等待该作业管道中的所有进程。如果未给出n,则等待所有当前活动的子进程,并且返回状态为零。如果n指定不存在的进程或作业,则返回状态为127.否则,返回状态是最后一个进程或作业等待的退出状态。
在你的情况下,它应该足够了:
REX="word"
grep -IP $REX A* >> result &
grep -IP $REX B* >> result &
grep -IP $REX C* >> result &
grep -IP $REX D* >> result &
echo "Waiting..."
wait
echo "All child terminated"
答案 1 :(得分:4)
我会以不同的方式解决你的问题。 find
可以在文件系统上找到特定文件,xargs
允许您在给定的输入文件上运行命令。所以我会使用这样的命令:
find ./ -type f -print0 | xargs -0 -I{} -n1 -P4 grep -IP $REX '{}' >> result
这将从当前目录(./
)开始搜索所有常规文件(-type f
),并将它们安全地传递给xargs
以防万一中存在任何空格文件名(-print0
)。 xargs
然后,对于每个命令,运行grep
命令。 -I{}
告诉xargs
它看到{}
的位置会将文件名插入到命令中。这里不是绝对必要的,但是很好的做法。 -0
与来自-print0
的{{1}}齐头并进,并告诉它期望以这种方式输入。 find
告诉-P4
同时运行最多4个进程,并且xargs
,如手册页所述,提示-n1
仅使用一个参数每个命令的时间。
你可以在这里进行各种调整,无论是不想搜索所有文件,还是只想进入certian深度,但是这个通用命令应该让你开始执行这类任务。
答案 2 :(得分:1)
尝试检查jobs -p | wc -l
的输出是否为零行。
仅供参考:与使用shell作为职位经理相比,有更好的方法进行并行处理。 find -print0
至xargs -0 -P
是我个人的最爱。
答案 3 :(得分:0)
使用等待。在这种情况下,我甚至认为你不需要保存和指定pids,例如
#! /usr/bin/env bash
REX="word"
grep -IP $REX A* >> result &
grep -IP $REX B* >> result &
grep -IP $REX C* >> result &
grep -IP $REX D* >> result &
[..]
wait
echo "done"
请注意,除了列出所有内容之外,还有更好的方法。例如,您可以将ls传递给xargs,或者将exec与find一起使用。