Laboratorio: búsqueda y reemplazo masivo en ficheros
Debido a la compra de Ideasapiens.com y para no perder el contenido actual, Jose Luis Antunez ha querido migrarlo a ideasapiens.blogsmedia.com.
El problema que se encontró fue tener que editar del código fuente de cada documento web la secuencia de texto www.ideasapiens.com a ideasapiens.blogsmedia.com. De esa forma los enlaces apuntarÃan al subdominio y accesos internos correspondientes donde ahora se alojarán los contenidos.
Para realizar esa búsqueda y reemplazo masivo, antes de pensar en alguna aplicación de escritorio que lo realizara, pensamos en un script para la shell de Linux que con una simple lÃnea se pudiera hacer. Bueno, tan simple no nos resultó y gracias a la ayuda de Dani lo pudimos sacar (tenÃamos la shell un tanto oxidada).
find . -type f -name "*.php" -exec sed -i s/www\.ideasapiens\.com/ideasapiens\.blogsmedia\.com/g {} \;
Viendo las complicaciones que estábamos teniendo con la shell (por una tonterÃa, dicha sea la verdad), Gabriel nos pasó el siguiente PHP, obteniendo el mismo resultado.
<?
// ###############################################################
// # Recursive Text Replacer 1.0
// ###############################################################
// String to be replaced (needle)
define('STR_NEEDLE','www.ideasapiens.com');
// String for replacement
define('STR_REPLACE','ideasapiens.blogsmedia.com');
// Path to the starting folder (can be absolute or relative)
// Must NOT end with slash
define('START_FOLDER','');
// Mask of files to search in
define('FILE_MASK','*.php');
// Email to send results to. Leave empty to not sent results
define('EMAIL','');
// Should it recurse (go down folders)? true - recurce, false - not recurse
define('RECURSE',true);
// job start time
$stime = time();
// files processed
$files_processed = 0;
// files updated (at least one replacement made in file)
$files_updated = 0;
// could not update files
$files_not_updated = 0;
// replace text in file
function file_replace ($filename) {
global $files_processed, $files_updated, $files_not_updated;
$files_processed++;
// get file contents
$txt = file_get_contents($filename);
// need replacement?
$update = (strpos($txt,STR_NEEDLE) !== FALSE);
// replace and save file
if ($update) {
// replace
$txt = str_replace (STR_NEEDLE, STR_REPLACE, $txt);
$f = @fopen($filename,'w+'); // open file
if ($f) {
@fputs($f,$txt); // save new file contents
@fclose($f);
$files_updated++; // increment updated files counter
}
else {
// could not update file. maybe permissions problem. increment counter
$files_not_updated++;
}
} // if ($update)
} // file_replace
// recurse folders
function dir_replace ($dirname, $recursive = RECURSE) {
$dir = opendir($dirname);
while ($file = readdir($dir)) {
if ($file != '.' && $file != '..') {
if (is_dir($dirname.'/'.$file)) {
if ($recursive) {
dir_replace($dirname.'/'.$file);
}
} else if (fnmatch(FILE_MASK, $file)) {
file_replace($dirname.'/'.$file);
}
}
}
} // dir_replace
if (!file_exists(START_FOLDER)) {
die("Folder \"" . START_FOLDER . "\" does not exist.");
}
//////////////////////////////////////////////////////
// start replacement
dir_replace(START_FOLDER);
// job end time
$etime = time();
// email results
// set email headers
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/plain; charset=\"us-ascii\"\r\n";
$headers .= "From: " . EMAIL . "\r\n";
$headers .= "Reply-To: " . EMAIL . "\r\n";
$headers .= 'X-Mailer: PHP/' . phpversion();
$message = "Hello,
Replacement script was run. Please see results below:
Files processed: $files_processed
Files updated: $files_updated
Files not updated (error ocurred): $files_not_updated
Minutes and seconds the job took from start to finish: " . date('i:s',$etime - $stime);
if (EMAIL != '') {
// send email
@mail(EMAIL, // TO email
'Replace results', // subject
$message, // email text
$headers); // headers
}
// just in case script was opened in browser - output to browser
echo nl2br($message);
?>
El código deberá ser subido al servidor en un archivo PHP, de nombre por ejemplo “buscar-reemplazar.php”. Lo situarás en un directorio superior del que se quiere trabajar, le darás CHMOD 755 y lo ejecutarás escribiendo su localización en la barra de dirección de tu navegador (por ej, http://nombrededominio.com/buscar-reemplazar.php) habiendo editado en el código que mostramos el texto que se quiere buscar por el que se quiere cambiar.