我在互联网用户可在线访问的服务器中有200万个文本文件。我被要求尽快对这些文件进行更改(字符串替换操作)。我在考虑在服务器上的每个文本文件上执行str_replace
。但是,我不想绑定服务器并让互联网用户无法访问它。
你认为以下是个好主意吗?
<?php
ini_set('max_execution_time', 1000);
$path=realpath('/dir/');
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach($objects as $name => $object){
set_time_limit(100);
//do str_replace stuff on the file
}
答案 0 :(得分:4)
cd /dir
find . -type f -print0 | xargs -0 sed -i 's/OLD/NEW/g
将在当前dir
内递归搜索(隐藏)所有文件,并使用OLD
替换NEW
sed
。
为什么-print0
?
来自man find:
如果要将find的输出传送到另一个程序中 你所拥有的文件是最微弱的可能性 搜索可能包含换行符,那么你应该认真对待 考虑使用&#39; -print0&#39;选项而不是&#39; -print&#39;。
为什么xargs
?
来自man find:
为每个匹配的文件运行一次指定的命令。
也就是说,如果/dir
中有2000个文件,那么find ... -exec ...
将导致2000 sed
的调用;而find ... | xargs ...
只会调用sed
一次或两次。
答案 1 :(得分:3)
不要用PHP做这件事,它最有可能失败,我会占用你所有的系统资源。
find . -type f -exec sed -i 's/search/replace/g' {} +
上面的示例包含搜索和替换字符串以及它的递归和常规文件,包括隐藏文件。
答案 2 :(得分:0)
您也可以使用仅限一个核心的Python程序(这是默认设置)。如果您的计算机有多个核心,并且通常至少有一个核心是免费的,那么您应该进行设置。