2014-10-06 91 views
0

当前我使用以下代码来搜索和替换当前文件夹下任何.php文件中的字符串。查找和xargs正确处理名称中包含空格的文件名

find . -name "*.php" -print | xargs sed -i 's/string1/string2/g' 

但是当它遇到名称中有空格的文件时,它会抛出一个错误No such file or directory。我将如何修改这一行以包含带空格的文件?

我会假设find命令的输出将不得不围绕文件路径输出双引号,但我不知道如何自己写这个。

回答

3
find . -name "*.php" -print0 | xargs -0 sed -i 's/string1/string2/g' 

你也可以不用xargs的根本:

find . -name "*.php" -execdir sed -i 's/string1/string2/g' {} + 
+0

'execdir'优于'exec'避免竞争条件下,至少在GNU的执行手册页推荐前者。 – legends2k 2014-10-06 08:38:34

+0

@ legends2k:你是对的(至少对于OP似乎正在使用的Linux)。我更新了我的答案。谢谢。 – 2014-10-06 08:40:26

+0

+1感谢您的回避:) – legends2k 2014-10-06 08:42:26

0

如果你在你的互动工作的一部分,这样做(不是里面的一些脚本 - 见限制),你可能会发现无限便捷下面太:

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 - 够平常互动工作...

1

如果你有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个作业:

Simple scheduling

GNU并行,而不是产生一个新的进程时,一个完成 - 保持CPU的活跃,从而节省了时间:

GNU Parallel scheduling

安装

如果您的发行版没有打包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

相关问题