批量重命名32000个文件 – 分成多个子目录

我有一个上传文件的networking服务器。 有一个脚本将其分配给数字ID并将其存储在相应的子目录中。

我现在已经有了32000个这样的上传文件,这对于服务器在一个目录中处理太多了。 我正在使用的脚本确实有一种“命名空间”上传的方式,因此ID 12345(而不是坐在/files/12345 )将位于/files/namespaced/000/012/345

代码可以处理这个很好,但我现在有32000个子目录在错误的命名风格。 什么是最简单的方法来通过我现有的文件,把他们在正确的地方?

这假定目录名称在其名称中没有任何奇怪的字符(如空格或换行符),并且没有以点开头的文件名。

未经testing。

 find /files -type d | while read -r dir do base="000000${dir##*/}" new="/files/namespaced/${base: -9:3}/${base: -6:3}/${base: -3}" mkdir -p "$new" mv "$dir/*" "$new" rmdir "$dir" done 

另一种获取新目录名的方法:

 new=$(echo "$dir" | sed 's|...$|/&|;s|\(.*\)/\(.*\)/\(...\)$|\1/namespaced/000000\2/\3|; s|\(.*\)/.*\(...\)\(...\)/\(...\)$|\1/\2/\3/\4|' "$dir")