当前我使用以下代码来搜索和替换当前文件夹下任何.php
文件中的字符串。查找和xargs正确处理名称中包含空格的文件名
find . -name "*.php" -print | xargs sed -i 's/string1/string2/g'
但是当它遇到名称中有空格的文件时,它会抛出一个错误No such file or directory
。我将如何修改这一行以包含带空格的文件?
我会假设find
命令的输出将不得不围绕文件路径输出双引号,但我不知道如何自己写这个。
当前我使用以下代码来搜索和替换当前文件夹下任何.php
文件中的字符串。查找和xargs正确处理名称中包含空格的文件名
find . -name "*.php" -print | xargs sed -i 's/string1/string2/g'
但是当它遇到名称中有空格的文件时,它会抛出一个错误No such file or directory
。我将如何修改这一行以包含带空格的文件?
我会假设find
命令的输出将不得不围绕文件路径输出双引号,但我不知道如何自己写这个。
find . -name "*.php" -print0 | xargs -0 sed -i 's/string1/string2/g'
你也可以不用xargs的根本:
find . -name "*.php" -execdir sed -i 's/string1/string2/g' {} +
如果你在你的互动工作的一部分,这样做(不是里面的一些脚本 - 见限制),你可能会发现无限便捷下面太:
shopt -s globstar #best add to into ~/.bash_profile
sed -i 's/string1/string2/g' ./**/*.php
局限性:所有的路径名的长度总和不能再作为回报getconf ARG_MAX
命令。在我的系统上262144字节 - 例如大约6500文件,如./somedir/subdir/subsubdir/filename.php
- 够平常互动工作...
如果你有GNU并行,你可以这样做:
find . -name "*.php" -print | parallel -q sed -i 's/string1/string2/g'
,如果你想将它们传递给之前处理的文件名,这是有用平行。例如。使用tail
:
find . -name "*.php" -print | tail -n 11 | parallel -q sed -i 's/string1/string2/g'
(如果字符串包含特殊字符时,才需要-q - 如空间)。
所有新计算机都有多个内核,但大多数程序本质上是串行的,因此不会使用多个内核。然而,许多任务十分parallelizeable:
GNU并行是一个通用的并行程序,可以很容易地在同一台机器或多台你有ssh访问的机器上并行运行作业。
如果你想在4个CPU上运行32个不同的工作岗位,并行化直接的方式是在每个CPU上运行8个作业:
GNU并行,而不是产生一个新的进程时,一个完成 - 保持CPU的活跃,从而节省了时间:
安装
如果您的发行版没有打包GNU Parallel,则可以执行个人安装,但不需要root访问权限。它可以在10秒内通过这样来完成:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
对于其他安装选项见http://git.savannah.gnu.org/cgit/parallel.git/tree/README
了解更多
查看更多的例子:http://www.gnu.org/software/parallel/man.html
观看介绍视频: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
走过t他教程:http://www.gnu.org/software/parallel/parallel_tutorial.html
订阅邮件列表,以获得支持:https://lists.gnu.org/mailman/listinfo/parallel
'execdir'优于'exec'避免竞争条件下,至少在GNU的执行手册页推荐前者。 – legends2k 2014-10-06 08:38:34
@ legends2k:你是对的(至少对于OP似乎正在使用的Linux)。我更新了我的答案。谢谢。 – 2014-10-06 08:40:26
+1感谢您的回避:) – legends2k 2014-10-06 08:42:26