Search code examples
phphtmlmacosreaddir

php read a dir and rename folders


I am trying to go through a directory and rename all of the folders to a certain name with the original folder name appended to the end. It works except alot of times it adds the title i want 2,3,4 times in front of the old folder name. The folders are originally numbers and i want to add a title before them.

Code:

$skip = array(".","..","...");

$dir = '/Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2';
$t = 'Avengers Volume 2';

if ($handle = opendir($dir)) {
    while (false !== ($entry = readdir($handle))) {
      if (!in_array($entry,$skip)) {
        $newName = $t." ".$entry;
        $ol = $dir."/".$entry;
        $nl = $dir."/".$newName;
        rename($ol,$nl);
      }
    }
    closedir($handle);
}

and what they get named too:

  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 9
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 11
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 7
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 6
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 1
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 10
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 8
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 4
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 3
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 12
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 2
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 13
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 5
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 Avengers Volume 2 9
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 Avengers Volume 2 11
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 Avengers Volume 2 7
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 Avengers Volume 2 1
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 Avengers Volume 2 10
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 Avengers Volume 2 4
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 Avengers Volume 2 3
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 Avengers Volume 2 2
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 Avengers Volume 2 13
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 Avengers Volume 2 Avengers Volume 2 9
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 Avengers Volume 2 Avengers Volume 2 7
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 Avengers Volume 2 Avengers Volume 2 3
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 Avengers Volume 2 Avengers Volume 2 Avengers Volume 2 9
  • /Volumes/COMICS/MOVED/Marvel Comics/Avengers/Volume 2/Avengers Volume 2 Avengers Volume 2 Avengers Volume 2 Avengers Volume 2 Avengers Volume 2 9

Solution

  • As I understand it a handle is a pointer - and the "data" it points is not fixed but can change. So I'm guessing that when you prefix the folder in your while loop the renamed folder is then also identified via handle by your while loop and prefixed again.

    You may be better off using glob

    $folders = glob( $dir . '/*' , GLOB_ONLYDIR);

    to return an array of sub-directories and then loop through array to rename all entries.