【发布时间】:2014-08-06 08:54:30
【问题描述】:
我有一个for 循环,它将循环遍历目录中的所有文件。我想对每个文件运行一个进程(在此示例中为echo 文件名和sleep 5)。但是我希望能够一次运行这 5 个文件(在后台使用&)。问题是我不知道如何在while 循环中迭代$f,这样我就不会最终处理同一个文件五次而不是同时处理五个不同的文件。
#!/bin/bash
maxjobs=5
for f in `ls /home/user/`
do
jobsrunning=0
while [ $jobsrunning -lt $maxjobs ]
do
echo "Converting file"$f
sleep 5 & #wait for 5 seconds
jobsrunning=$((jobsrunning + 1))
echo $jobsrunning
done
wait
done
【问题讨论】:
-
您永远不会将
jobsrunning重置为 0。但是存在更好的解决方案来将文件“提供”到进程。在此处搜索find print0 xargs。不幸的是,最后一个任期可能是multiple, jobs, -n或其他几个。 -
不需要带有 for 的
ls ...子shell。 “for f in /home/user/*”就足够了 - 与 ls 的不同之处在于名称将是完全限定的,因此不是直接替换。在您的情况下可能更可取,因为对这些文件的操作需要知道您当前解决方案所需的隐含“/home/user”位置 -
“这样我就不会最终处理同一个文件五次而不是同时处理五个不同的文件”没有多大意义。你为什么要处理同一个文件五次?为什么打印到屏幕时,相同的文件名会出现 5 次?
-
@Bushmills 因为 while 循环。
标签: bash for-loop while-loop