我有 500,000 个.abc
文件。现在我想将它们分发到 10 个不同的子目录中,每个子目录包含 50,000 个这样的文件。
我尝试过类似
ls -1 | (cd /path/to/folder/1; split --lines=50000).
这将创建诸如xaa
、xab
、... 之类的文件,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
如果结果对您来说正确,请删除。