我在系统上进行了大量文件操作,在一次特定的批处理作业中,我最终得到了大约 16 GB 的文件。我需要将这些数据准备成更小的块以供另一个进程使用。
我将其拆分为每个文件 10k 行,并使用数字索引填充至 5 位数字
split -a 5 -d -l 10000 large_input_file /out_path/out.
这样,我最终得到了名为
out.00000
out.00001的文件
...
问题是这种方式的索引总是从 0 开始。
有没有办法将其设置为任意的起始索引? man 没有透露任何内容...
答案1
之后对文件重新编号并不是什么大问题。
split -a 5 -d -l 10000 large_input_file /out_path/tmp.
for x in /outpath/tmp.*; do
mv -i -- "$x" "${x%/*}/out.$(printf %05d $((10#${x##*.}+1)))";
done
请注意两个陷阱:
out.00000
重命名为等的简单方法out.00001
不起作用,因为通配符会扩展为按字典顺序排列的列表,因此第一次重命名会覆盖第二个文件。在 zsh 中,您可以使用(On)
glob 限定符。在其他 shell 中,最简单的方法是更改名称的词干。- 在 shell 算术中,前导
0
导致数字以八进制解释。10#${…}
强制以十进制解释。 printf %05d
是一种将填充维持为 5 位数字的方法。
答案2
我认为 split 中不存在此选项。我有一个 coreutils 错误(功能请求)——http://savannah.gnu.org/bugs/?22231