如何处理数千个文件夹。需要将每个x文件夹移动到新文件夹

时间:2018-09-21 13:07:27

标签: linux bash shell

在一个文件夹中,我假设有1.000.000个子文件夹。在Ubuntu Linux中,如何使用bash shell脚本使用以下命名模式为每个1000个文件夹创建一个新文件夹? 12位数字,例如000000001 000000002、000000003等

我可以去这里

cp -r directory_1 /user/home/office

但是我需要循环进入目录,并对找到的前1000个文件夹执行上述操作。然后找到接下来的1000个文件夹的上述命令 cp -r directory_1 / user / home / office

即使cp也不是我想要的,我想移动文件夹,但是在使用mv时出现错误

1 个答案:

答案 0 :(得分:-1)

以下脚本创建一个包含12位数字的目录(例如000000000001),并将子目录移动到该目录。对于每移动1.000个子目录,将创建一个新的12位数字目录,并且脚本继续。

您可以使用脚本的前三个变量来配置脚本:

  • oldParentDir应当移动其子目录的目录
  • newParentDir一个现有目录,应放置新的12位数字目录。这可以与oldParentDir相同。
  • subDirsPerNewDir每个12位数字目录的最大子目录数。
#! /bin/bash

oldParentDir="directory/which/contains/1.000.000/subdirectories"
newParentDir="existing/directory/where/new/dirs/should/be/placed"
subDirsPerNewDir=1000

createdNewDirs=0
movedSubDirs=0
for subDir in "$oldParentDir/"*/; do
    if (( movedSubDirs % subDirsPerNewDir == 0 )); then
        (( createdNewDirs++ ))
        newDir="$(printf %012d "$createdNewDirs")"
        mkdir "$newParentDir/$newDir"
    fi
    mv "$subDir" "$newDir"
    (( movedSubDirs++ ))
done

请注意,只有子目录被移动。如果您还想移动文件,请将"$oldParentDir/"*/更改为"$oldParentDir/"*

分组按字母顺序进行。 subDirsPerNewDir=5的示例:

  • 如果您的子目录分别命名为sub1sub2,...,sub100,则目录sub1sub10,{{1 }},sub100sub11将移至sub12
  • 如果您的子目录分别命名为00000000001sub001,...,sub002,则目录sub100sub001,{{1 }},sub002sub003将移至sub004

我假设sub005至少包含一个子目录,而00000000001确实已经包含具有12位数字名称的任何文件或目录(例如{ {1}})。您可以在脚本的开头添加oldParentDirnewParentDir,以使其更健壮。