查找和xargs以正确处理名称中带有空格的文件名

时间:2014-10-06 08:33:36

标签: linux bash

目前,我使用以下代码在当前文件夹下的任何.php文件中搜索和替换字符串。

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

但是当遇到名称中有空格的文件时,它会以No such file or directory引发错误。如何修改此行以包含带空格的文件?

我认为find命令的输出必须在文件路径周围输出双引号,但我不知道如何自己编写。

3 个答案:

答案 0 :(得分:3)

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

你也可以在没有xargs的情况下完成:

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

答案 1 :(得分:1)

如果你有GNU Parallel,你可以这样做:

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,例如空格)。

所有新计算机都有多个内核,但大多数程序本质上是串行的,因此不会使用多个内核。但是,许多任务都非常可并行化:

  • 在许多文件上运行相同的程序
  • 为文件中的每一行运行相同的程序
  • 为文件中的每个块运行相同的程序

GNU Parallel是一个通用的并行程序,可以很容易地在同一台机器上或在你有ssh访问权限的多台机器上并行运行作业。

如果要在4个CPU上运行32个不同的作业,并行化的直接方法是在每个CPU上运行8个作业:

Simple scheduling

GNU Parallel会在完成后生成一个新进程 - 保持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

完成教程:http://www.gnu.org/software/parallel/parallel_tutorial.html

注册电子邮件列表以获得支持:https://lists.gnu.org/mailman/listinfo/parallel

答案 2 :(得分: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 - 足以进行常规的互动工作......