2011-02-14 22 views
9

Tengo 1000 imágenes en una carpeta, que tiene SKU # palabra en todas las imágenes. Para ejemplosCambiar nombre de archivos a granel en una carpeta - PHP

WV1716BNSKU#.zoom.1.jpg 
WV1716BLSKU#.zoom.3.jpg 

lo que tengo que hacer es leer todos los nombres de archivo y cambiarle el nombre a la siguiente

WV1716BN.zoom.1.jpg 
WV1716BL.zoom.3.jpg 

Así quitar SKU # del nombre del archivo, es posible que en PHP para hacer el cambio de nombre a granel?

+0

¿Quiere decir algo así como un bucle que cambia el nombre de todos los archivos? –

Respuesta

21

Sí, basta con abrir el directorio y crear un bucle para acceder a todas las imágenes y cambiar el nombre de ellos, como:

<?php 

if ($handle = opendir('/path/to/files')) { 
    while (false !== ($fileName = readdir($handle))) { 
     $newName = str_replace("SKU#","",$fileName); 
     rename($fileName, $newName); 
    } 
    closedir($handle); 
} 
?> 

Referencias:

http://php.net/manual/en/function.rename.php

http://php.net/manual/en/function.readdir.php

http://php.net/manual/en/function.str-replace.php

1

Los pasos para completar este es bastante simple:

  • iterar sobre cada archivo utilizando fopen, readdir
  • para cada archivo de analizar el nombre de archivo en segmentos
  • copiar el archivo antiguo en un nuevo directamente llamados anterior (razones de sensatez)
  • cambie el nombre del archivo raíz al comienzo del nuevo nombre.

Un pequeño ejemplo:

if ($handle = opendir('/path/to/images')) 
{ 
    /* Create a new directory for sanity reasons*/ 
    if(is_directory('/path/to/images/backup')) 
    { 
     mkdir('/path/to/images/backup'); 
    } 

    /*Iterate the files*/ 
    while (false !== ($file = readdir($handle))) 
    { 
      if ($file != "." && $file != "..") 
      { 
       if(!strstr($file,"#SKU")) 
       { 
        continue; //Skip as it does not contain #SKU 
       } 

       copy("/path/to/images/" . $file,"/path/to/images/backup/" . $file); 

       /*Remove the #SKU*/ 
       $newf = str_replace("#SKU","",$file); 

       /*Rename the old file accordingly*/ 
       rename("/path/to/images/" . $file,"/path/to/images/" . $newf); 
      } 
    } 

    /*Close the handle*/ 
    closedir($handle); 
} 
+0

Este fragmento funciona bien pero también cambió el nombre de las extensiones del archivo. ¿Puedes resolverlo? –

2

Pues bien, el uso de iteradores:

class SKUFilterIterator extends FilterIterator { 
    public function accept() { 
     if (!parent::current()->isFile()) return false; 
     $name = parent::current()->getFilename(); 
     return strpos($name, 'SKU#') !== false; 
    } 
} 
$it = new SkuFilterIterator(
    new DirectoryIterator('path/to/files') 
); 

foreach ($it as $file) { 
    $newName = str_replace('SKU#', '', $file->getPathname()); 
    rename($file->getPathname(), $newName); 
} 

El FilterIterator básicamente filtra todos los no-archivos y archivos sin el SKU# en ellos. Entonces todo lo que hacemos es iterate, declarar un nuevo nombre, y cambiar el nombre del archivo ...

O en 5.3+ utilizando la nueva GlobIterator:

$it = new GlobIterator('path/to/files/*SKU#*'); 
foreach ($it as $file) { 
    if (!$file->isFile()) continue; //Only rename files 
    $newName = str_replace('SKU#', '', $file->getPathname()); 
    rename($file->getPathname(), $newName); 
} 
9

pedazo de la torta:

foreach (array_filter(glob("$dir/WV1716B*.jpg") ,"is_file") as $f) 
    rename ($f, str_replace("SKU#", "", $f)); 

(o $dir/*.jpg si el número no importa)

+0

= 1 para una solución más simple. editado: 'array_filte'r toma el primer parámetro como matriz. – diEcho

+0

glob suele ser unas veces más lento que la iteración de directorios; por lo tanto, si tiene muchos archivos, eso es algo a tener en cuenta: https://www.phparch.com/2010/04/putting-glob-to-the-test / – Picard

1

también puede utilizar este ejemplo:

$directory = 'img'; 
$gallery = scandir($directory); 
$gallery = preg_grep ('/\.jpg$/i', $gallery); 
// print_r($gallery); 

foreach ($gallery as $k2 => $v2) { 
    if (exif_imagetype($directory."/".$v2) == IMAGETYPE_JPEG) { 
     rename($directory.'/'.$v2, $directory.'/'.str_replace("#SKU","",$v2)); 
    } 
} 
Cuestiones relacionadas