Массовое переименование файлов в папке – PHP

У меня есть 1000 изображений в папке, у которой есть слово SKU # во всех изображениях. Например

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

что мне нужно сделать, это прочитать все имена файлов и переименовать их в следующее

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

Так что удалите SKU # из имени файла, возможно ли в PHP делать массовое переименование?

Да, просто откройте каталог и создайте цикл для доступа ко всем изображениям и переименуйте их, например:

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

Рекомендации:

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

Кусок пирога:

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

(или $dir/*.jpg если число не имеет значения)

Ну, используя итераторы:

 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); } 

FilterIterator в основном отфильтровывает все нефайлы и файлы без SKU# в них. Тогда все, что вы делаете, это итерация, объявление нового имени и переименование файла …

Или в 5.3+ с помощью нового 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); } 

Шаги по его завершению довольно просты:

  • итерация по каждому файлу с помощью fopen , readdir
  • для каждого файла проанализируйте имя файла в сегментах
  • скопируйте старый файл в новый, называемый старым (соображения разумности)
  • переименуйте корневой файл поверх нового имени.

Небольшой пример:

 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); } 

Вы также можете использовать этот образец:

 $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)); } }