将 500,000 个文件分发到 10 个子目录中,每个子目录包含 50,000 个文件

将 500,000 个文件分发到 10 个子目录中,每个子目录包含 50,000 个文件

我有 500,000 个.abc文件。现在我想将它们分发到 10 个不同的子目录中,每个子目录包含 50,000 个这样的文件。

我尝试过类似

ls -1 | (cd /path/to/folder/1; split --lines=50000).

这将创建诸如xaaxab、... 之类的文件,xak其名称为 50,000 个不同的.abc文件。但它们只是名称而不是文件。

答案1

mv `ls *.abc | head -50000` ./subfolder1/

使用不同的子文件夹名称运行此命令 10 次。

您想如何命名这 10 个子文件夹?可以使用 for 循环,而不是运行该命令 10 次。

解释

  • ls *.abc | head -50000- 列出 5,00,000 个 .abc 文件中的前 50,000 个文件
  • mv <ls part> ./subfolder1/- 将所有 50,000 个列出的文件移至名为 subfolder1 的目录

答案2

您可以使用简单的 bash shell 循环来处理它:

#!/bin/bash

count=0
for file in *.abc
do
  dir=$(( count / 50000 ))
  (( count++ ))
  [ ! -d "$dir" ] && mkdir "$dir"
  echo mv -- "$file" "$dir"/
done

这会硬编码许多文件以移动到每个目录;目录从零开始递增命名。

在一个更短的示例中(一次仅将 20 个文件移动 10 个到 2 个目录中),输出为:

mv -- 01.abc 0/
mv -- 02.abc 0/
mv -- 03.abc 0/
mv -- 04.abc 0/
mv -- 05.abc 0/
mv -- 06.abc 0/
mv -- 07.abc 0/
mv -- 08.abc 0/
mv -- 09.abc 0/
mv -- 10.abc 0/
mv -- 11.abc 1/
mv -- 12.abc 1/
mv -- 13.abc 1/
mv -- 14.abc 1/
mv -- 15.abc 1/
mv -- 16.abc 1/
mv -- 17.abc 1/
mv -- 18.abc 1/
mv -- 19.abc 1/
mv -- 20.abc 1/

echo如果结果对您来说正确,请删除。

相关内容