簡體   English   中英

遞歸重命名目錄中的所有子目錄

[英]Rename all subdirectories within a directory recursively

我當前正在使用以下代碼列出特定目錄中的所有子目錄。

$dir = realpath('custom_design_copy/');

$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::SELF_FIRST);

foreach($objects as $name => $object){
    if(is_dir($object)){
        echo "$name<br />";
    }
}

這給了我看起來像這樣的結果。

C:\Data\Web\custom_design_copy\Product
C:\Data\Web\custom_design_copy\Product\images
C:\Data\Web\custom_design_copy\Product\Scripts

我要執行的操作是使用strtoupper()重命名所有這些子目錄,以規范其所有名稱。 我知道rename()函數,但是我擔心如果嘗試以下操作:

rename($name, strtoupper($name));

我最終將修改custom_design_copy的父目錄名稱之一,這是我希望避免的。 如何避免這個問題? 我正在考慮使用substr()並搜索最后一次出現的“ \\”,以便在末尾隔離目錄名稱,但是必須有一個更簡單的解決方案。 我要尋找的最終結果是這個。

C:\Data\Web\custom_design_copy\PRODUCT
C:\Data\Web\custom_design_copy\PRODUCT\IMAGES
C:\Data\Web\custom_design_copy\PRODUCT\SCRIPTS

編輯:在等待建議的同時,我嘗試了最初的方法,發現它可行。

$dir = realpath('custom_design_copy/');

$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::SELF_FIRST);

foreach($objects as $name => $object){
    if(is_dir($object)){
        $slashPos = strrpos($name, '\\');
        $newName  = substr($name, 0, $slashPos + 1) . strtoupper(substr($name, $slashPos + 1));

        rename($name, $newName);

        echo "$name<br />";
    }
}

您的示例使用RecursiveIteratorIterator::SELF_FIRST標志,該標志列出了迭代中的葉子和父對象,其中父對象排在第一位來自docs )。

這意味着具有如下目錄結構:

foo/
foo/bar/
foo/bar/bat.txt

迭代順序是從父級到葉子:

  1. 富/
  2. 富/酒吧/
  3. 富/蝙蝠/ bat.txt

正如您已經指出的那樣,這可能會有問題。


根據您的需要,應使用RecursiveIteratorIterator::CHILD_FIRST標志。 該標志指示迭代器從葉子到父級朝另一個方向移動。

  1. 富/酒吧/ bat.txt
  2. 富/酒吧/
  3. 富/

您可以將所有目錄存儲在數組中,然后可以按降序循環數組,將最后一個文件夾更改為大寫。

這是一個例子:

$path = 'custom_design_copy' . DIRECTORY_SEPARATOR;

$main_dir = realpath($path);

$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($main_dir), RecursiveIteratorIterator::SELF_FIRST);

foreach ($objects as $name => $object) {

    if ($object->isDir() && !in_array($object->getFilename(), array('.', '..'))) {

        $directories[] = $name;

    }
}

foreach (array_reverse($directories) as $dir) {
    rename($dir, last_path_upper($dir));
}

function last_path_upper($str) {

    $arr = explode(DIRECTORY_SEPARATOR, $str);

    $last = array_pop($arr);

    return join(DIRECTORY_SEPARATOR, $arr) . DIRECTORY_SEPARATOR . strtoupper($last);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM