目前,我使用以下代码在当前文件夹下的任何.php
文件中搜索和替换字符串。
find . -name "*.php" -print | xargs sed -i 's/string1/string2/g'
但是当遇到名称中有空格的文件时,它会以No such file or directory
引发错误。如何修改此行以包含带空格的文件?
我认为find
命令的输出必须在文件路径周围输出双引号,但我不知道如何自己编写。
答案 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个作业:
GNU Parallel会在完成后生成一个新进程 - 保持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
完成教程: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
- 足以进行常规的互动工作......