2011-02-14 30 views
9

Tüm resimlerde SKU # kelimesine sahip bir Klasörde 1000 adet resmim var. örneklerToplu Bir Klasördeki Dosyaları Yeniden Adlandır - PHP

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

için ne ben tüm dosya adlarını okuyup Yani şu

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

için yeniden adlandırın dosya gelen SKU # kaldırmak yapmanız gereken, PHP içinde toplu yeniden adlandırma yapmak mümkündür?

<?php 

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

Referanslar:

+0

Tüm dosyaları yeniden adlandıran bir döngü gibi bir şeyden mi bahsediyorsunuz? –

cevap

1

bu tamamlayarak adımları oldukça basittir: fopen kullanarak her dosyanın üzerine

  • yinelerler, her dosya için readdir
  • (
  • yeni doğrudan denilen eski haline eski dosyayı kopyalamak segmentler halinde dosya adını ayrıştırmak akıl nedenleri)
  • kök adını yeniden adlandırın.

Bir küçük örnek:

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

Bu snippet iyi çalışıyor ancak dosyanın uzantılarını da değiştirdi. onu çözebilir misin ?? Daha basit bir çözüm için –

2

Eh, iterators kullanarak:

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 temelde onları SKU# olmadan olmayan tüm dosyaları ve dosya filtreler. kek

$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

parça:

foreach (array_filter(glob("$dir/WV1716B*.jpg") ,"is_file") as $f) 
    rename ($f, str_replace("SKU#", "", $f)); 
Sonra tek yapmanız yinelerler olduğunu yeni GlobIterator kullanarak ...

Ya 5.3+ yeni bir ad bildirmek ve dosyayı yeniden adlandırmak

(veya $dir/*.jpg sayı önemli değilse) Ayrıca bu örnek kullanabilirsiniz

+0

= 1. düzenlenmiş: 'array_filte'r ilk parametreyi dizi olarak alır. – diEcho

+0

glob genellikle dizin yinelemesinden birkaç kat daha yavaş - bu yüzden çok fazla dosyanız varsa - dikkate alınması gereken bir şey: https://www.phparch.com/2010/04/putting-glob-to-the-test / – Picard

1

:

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