【发布时间】:2013-07-13 08:42:49
【问题描述】:
我正在尝试这段代码:
for f in jobs/UPDTEST/apples* ; do
nf=`echo $f | sed s:jobs\/::g`
echo $nf | tr '_' ' '
done > jobs
有 750 个apples* 类型的文本文件。但因为我只是弄乱了文件名——我原以为应该很快——但大约需要 5 分钟。
有没有其他方法可以做到这一点?
【问题讨论】:
-
你为什么不直接使用 === ls jobs/UPDTEST/apples* | sed -e 's:.*apples:apples:g;s/_/ /g' > 工作 === ?当然,您这样做的方式远非高效,至少因为您使用了很长的参数列表,并调用了“sed”和“tr”第 n 次,嵌套管道等等。你太复杂了。
-
这很慢,因为管道的
forks很昂贵,并且每次迭代最多分叉四个进程。仅仅为了改变几个字符而分叉就像用平板卡车运送你的杂货一样。任何想要避免分叉的 shell 程序员都必须彻底了解 shell 的内置工具箱。 -
@PiotrWadas 您的建议效果很好,只需稍作改动:ls -d jobs/UPDTEST/apples* | sed -e 's:jobs\/::g;s/_/ /g' > 工作 谢谢