Bulk Rename Files in a Folder - PHP

后端 未结 5 1470
日久生厌
日久生厌 2020-12-02 21:23

I have 1000 images in a Folder, which has SKU# word in all the images. For examples

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

what i

相关标签:
5条回答
  • 2020-12-02 21:49

    The steps to completing this is pretty simple:

    • iterate over each file using fopen, readdir
    • for each file parse the file name into segments
    • copy the old file into a new directly called old (sanity reasons)
    • rename the root file top the new name.

    A small example:

    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 讨论(0)
  • 2020-12-02 21:53

    You can also use this sample:

    $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));
        }
    }
    
    0 讨论(0)
  • 2020-12-02 22:02

    Yeah, just open the directory and create a loop to access all images and rename them, like:

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

    References:

    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

    0 讨论(0)
  • 2020-12-02 22:09

    piece of cake:

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

    (or $dir/*.jpg if number doesn't matter)

    0 讨论(0)
  • 2020-12-02 22:14

    Well, using iterators:

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

    The FilterIterator basically filters out all non-files, and files without the SKU# in them. Then all you do is iterate, declare a new name, and rename the file...

    Or in 5.3+ using the new 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);
    }
    
    0 讨论(0)
提交回复
热议问题