使用 split 命令命名分割文件

使用 split 命令命名分割文件

我正在编写一个 shell 脚本,在其中读取目录中的所有文件,执行一些条件检查并根据记录数(行)拆分某些文件

我想将文件 abc.txt 拆分为 abc(AA 或 01).txt (只要它以 abc 开头并以 .txt 结尾,我不介意任何内容)

有没有一种简单的方法可以做到这一点?

我正在使用 split 命令:

split -l $line_count $file $????   

我很困惑应该用什么代替???

我也对其他方法持开放态度,但我更愿意只更改 ???因为脚本的其他部分已经准备好了。

非常感谢

答案1

尝试:

split -l 5 --additional-suffix=.txt abc.txt abc

或者,如果您想要用数字代替字母:

split -l 5 -d --additional-suffix=.txt abc.txt abc

abc我们在文件名后面添加的用作字首

因为您想要.txt作为后缀,所以我们添加了选项--additional-suffix=.txt.

可选-d指示split使用数字而不是字母。

例子

让我们从一个包含一个文件的目录开始:

$ ls
abc.txt

现在,让我们拆分该文件:

$ split -l 5 -d --additional-suffix=.txt abc.txt abc
$ ls
abc00.txt  abc01.txt  abc02.txt  abc03.txt  abc.txt

解决方法1:使用shell

当前版本的 GNU split 支持该--additional-suffix选项,并且split是 GNU coreutils 的一部分。这意味着该选项最终将在所有 Linux 系统上可用。

split对于当前缺乏它的系统,一种解决方法是在创建文件后重命名文件。例如:

$ split -l 5 -d abc.txt abc
$ for f in ./abc??; do mv "$f" "$f.txt"; done
$ ls
abc00.txt  abc01.txt  abc02.txt  abc03.txt  abc.txt

上面假设应用默认后缀长度 2。如果不是,请更改 的数量?以匹配您正在使用的后缀长度。例如,如果您使用的后缀长度为 5:

$ split -l 5 -a 5 -d abc.txt abc
$ for f in ./abc?????; do mv "$f" "$f.txt"; done
$ ls
abc00000.txt  abc00001.txt  abc00002.txt  abc00003.txt  abc.txt

解决方法 2:使用 awk

此处,该选项l指定每个拆分文件中包含的行数,并d指定拆分文件名中使用的位数。确保d足够大。

$ awk -v l=5 -v d=2 '{n="0000" int((NR-1)/l); f="abc" substr(n,length(n)+1-d) ".txt"; if (f!=old) close(old); old=f; print >f}' abc.txt
$ ls
abc00.txt  abc01.txt  abc02.txt  abc03.txt  abc.txt

相关内容