在linux中重命名和更改数百万文件的目录结构

在linux中重命名和更改数百万文件的目录结构,linux,rename,file-rename,batch-rename,Linux,Rename,File Rename,Batch Rename,我有大约400万个JPEG文件,我想重命名并更改其目录结构 仅仅重命名一个目录是不可能的,每一个文件名和目录的更改都是唯一的,不幸的是,必须逐个完成 我目前唯一的计划是一个PHP脚本,它将从文本文件中读取新旧名称,然后逐个运行system(“mv$src$dest”),以及任何必需的mkdir命令 我猜这将需要很长时间-有更好的策略来做到这一点吗?它是否会导致过度的磁盘抖动并可能杀死我的服务器?你会让它继续并忘记它,还是把它分成小块?这个特定的服务器目前没有做任何其他事情,所以我不需要担心运行它

我有大约400万个JPEG文件,我想重命名并更改其目录结构

仅仅重命名一个目录是不可能的,每一个文件名和目录的更改都是唯一的,不幸的是,必须逐个完成

我目前唯一的计划是一个PHP脚本,它将从文本文件中读取新旧名称,然后逐个运行
system(“mv$src$dest”),以及任何必需的mkdir命令

我猜这将需要很长时间-有更好的策略来做到这一点吗?它是否会导致过度的磁盘抖动并可能杀死我的服务器?你会让它继续并忘记它,还是把它分成小块?这个特定的服务器目前没有做任何其他事情,所以我不需要担心运行它的网站的QoS或类似的问题

EDIT:下面是我快速编写的PHP脚本:

ini_set('memory_limit', '2048M');

$files = file('old-and-new-names.txt');

$directoriesMade = ['/', '/home/', '/home/originals/'];

foreach($files as $n) {

    $n = trim($n);

    [$old, $new] = explode(' ', trim($n));
    $old = '/home/originals'.trim($old);
    $new = '/home/originals'.trim($new);

    echo "\nOLD: ".$old;
    echo "\nNEW: ".$new;

    $dirs = explode('/', $new);
    array_pop($dirs);  // don't want the last item as that's the filename, not a directory

// go through all of the required levels to ensure the directories are created
// using a php array storing the ones already created in an effort to take some pressure off the disk system?
    $path = '';
    foreach ($dirs as $dir) {
        $path .= $dir . '/';
        if (!in_array($path, $directoriesMade)) {
            echo "\n"."system(\"mkdir $path\")";
            system("mkdir $path");
            $directoriesMade[] = $path;
        }
    }

    echo "\nsystem(\"mv $old $new\")";
    system("mv $old $new");

    echo "\n\n";
}
和一小部分名称

/20191103/halloween-charity-ride/halloween2019990.jpg /0100/20191103/halloween-charity-ride/452d2ebfde0c5cda6f77188d05e21a06.jpg
/20191103/halloween-charity-ride/halloween2019991.jpg /0100/20191103/halloween-charity-ride/a582eeb68ed42fc7169e80d3c02d715e.jpg
/20191103/halloween-charity-ride/halloween2019992.jpg /0100/20191103/halloween-charity-ride/cb36c56995e4d16e20768753485f6174.jpg
/20191103/halloween-charity-ride/halloween2019993.jpg /0101/20191103/halloween-charity-ride/b707951dd72dbcbdae90be76db8dc4be.jpg
/20191103/halloween-charity-ride/halloween2019994.jpg /0101/20191103/halloween-charity-ride/765f9d00e8b18e6a2e41ee14e56fca27.jpg
/20191103/halloween-charity-ride/halloween2019995.jpg /0101/20191103/halloween-charity-ride/dd92d28b72d504329a49db23e51c879b.jpg

有一个名为mmv(1)的命令以及其他命令可以帮助您。关于磁盘抖动,这不应该是一个问题。我已经看过了,我认为mmv对我没有帮助,因为没有通配符模式可以用于此。所有文件都将从其原始名称重命名为其名称的md5(我已经预先计算了这些名称),并被重命名为一个新的目录结构。很高兴了解磁盘抖动。现在我明白了。我认为,通过一个简单的shell脚本,您可以做您想做的事情,避免了php和system()调用的负担。给我们看一段有新旧名字的文件片段,就会有人试图回复。同时考虑将长任务分解成更小的步骤。。例如,在单独的步骤中移动以A、B、C开头的所有文件。这会有帮助的。我已经添加了我刚写的脚本。FWIW测试运行在13秒内移动了500个文件,所以我认为大约需要30个小时才能完成。