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