按顺序从一个目录移动 20,000 个文件,依此类推

按顺序从一个目录移动 20,000 个文件,依此类推

我想要完成的是我有一个包含 176,000 个文件的目录。我希望脚本将 176,000 个文件拆分为文件夹,每个文件夹包含 20,000 个文件,最后一个包含奇怪的球 #。我想按顺序复制文件并按字母数字顺序保存它们。这是我目前拥有的,但它似乎缺少一些东西,它创建的前 2 个文件夹是乱序的,它创建的其他 3 个文件夹是连续的。

最重要的是,文件夹包含 176,000 个文件,脚本会将前 20,000 个文件移动到名为“split”的文件夹中,然后获取接下来的 20,000 个文件,依此类推,创建 split2、split3 等。

这是我所拥有的:

#!/bin/bash

dir_size=20000
dir_name="split"
n=$((`find . -maxdepth 1 -type f | wc -l`/$dir_size+1))
for i in `seq 1 $n`;
do
    mkdir -p "$dir_name$i";
    find  .  -maxdepth 1 -type f | sort -n -z |  head -n $dir_size |  xargs -i mv "{}" "$dir_name$i"
done

答案1

  • 列出您的文件(请注意,您不能使用ls *or ,ls*.dpx因为这会创建一个包含 176000 个参数的命令行ls)并使用split将此列表分割成块(名为 的文件files.01files.02...)(唯一的-告诉 split 来处理标准输入)。
ls | split -d --lines 20000 - files.
  • 对于更严格的过滤,您还可以find像以前一样使用管道输出到split排序后:
find . type f | sort | split -d --lines 20000 - files.
  • 迭代生成的files.*,使用数字部分创建目录名称,然后移动文件:
for f in files.*  # iterate the files.*
do 
    dirname="/path/to/dir${f#*.}"  # generate directory name from numeric suffix
    mkdir -p "$dirname" # create the directory
    xargs mv -t "$dirname" < $f # move the files
done

警告:未经测试,请先尝试小样本。

如果文件名中有空格,请使用find -print0sort -z和。split --separator '\0'xargs -0

相关内容