我想要完成的是我有一个包含 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.01
,files.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 -print0
、sort -z
和。split --separator '\0'
xargs -0