【发布时间】:2020-01-16 21:07:23
【问题描述】:
我有一个包含 >10000000 个文件的文件夹,需要将它们移动到每个文件夹 5000 个。使用批处理脚本如何将它们移动到单个文件夹?
【问题讨论】:
-
文件夹应该如何命名?你试过什么?
我有一个包含 >10000000 个文件的文件夹,需要将它们移动到每个文件夹 5000 个。使用批处理脚本如何将它们移动到单个文件夹?
【问题讨论】:
i=0
while true; do
ls | head -5000 > ../files
if [ ! -s ../files ]; then
break
fi
(( i++ )) # Boomer here but feeling younger every day thanks to KamilCuk.
mkdir ../dir$i # I know. No error checking here.
while read filename; do
mv "$filename" ../dir$i # No error checking here either.
done < ../files
done
如果mkdir 或mv 反复失败,此脚本将成为无限循环。您还必须小心存储临时文件files 的位置以及创建目标目录的位置;否则下一个ls 必须避免识别上一个循环迭代的输出目录。
如果文件名包含换行符,脚本也会出现问题(不太可能但很容易完成)。如果你有这个用例,那么,这个脚本将再次进入无限循环,因为mv 命令将失败,因为read 将无法正确读取该文件名。
【讨论】:
Boomer here :) bash hackers wiki Obsolete and deprecated syntax。 while [ 1 ],只是while : 或while true。 [ 1 ] 很奇怪,它检查字符串 1 是否有非零长度。
mv 可以一次读取一行文件列表,那将非常方便。那么字符转义问题可能就没有实际意义了。