У меня есть 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
Кусок пирога:
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)); } }