Unix/Linux 上的标准 split 命令允许您将文件按字节或行分割成固定大小的块,输出文件名以字母或数字为后缀(例如 PREFIXaa、PREFIXab、... 或 PREFIX1、PREFIX2、...)
然而,仅从输出名称无法清楚知道应该有多少件。
是否有标准工具可以执行此操作,例如输出到 PREFIX1of4、PREFIX2of4... 或类似内容?或者这是 Perl 的工作(即我找到一个 Perl 脚本)。
谢谢!
沃多
答案1
如果您需要从生成的“片段文件”名称中完全识别“片段编号”,则可以使用“-d”,并将后缀参数设置为应生成“片段文件”的目录名称。使用“-a”,您可以指定用于生成后缀名称的数字位数。
示例:拆分文件“cfg.pm”,每个输出文件 3 行;使用 3 位数字作为生成的后缀(确保名称空间未耗尽);使用纯数字后缀;通过指定目录作为前缀来使用技巧拆分生成纯数字文件名
mkdir ./s
split -a 3 -l 3 -d cfg.pm s/
在那之后,
ls s | tail -1
将隐式地给出生成的文件的数量
ls s|tail -1
414
答案2
摘自 adirau 的回答:
如果您的系统有名为 Perl 的脚本rename
(并且该版本支持这样做),您可以重命名文件,以便每个数字增加一,并有一个前缀和后缀:
count=$(($(ls s | tail -n 1) + 1))
rename "my \$n=sprintf(\"%03d\", \$_+1); my \$c=sprintf(\"%03d\", $count); s/.*/prefix\${n}of\${c}/" *
这将重命名文件:
000
001
002
到:
prefix001of003
prefix002of003
prefix003of003
顺便说一下,这是该 Perl 脚本的主要内容:
use strict;
use Getopt::Long;
Getopt::Long::Configure('bundling');
my ($verbose, $no_act, $force, $op);
die "Usage: rename [-v] [-n] [-f] perlexpr [filenames]\n"
unless GetOptions(
'v|verbose' => \$verbose,
'n|no-act' => \$no_act,
'f|force' => \$force,
) and $op = shift;
$verbose++ if $no_act;
if (!@ARGV) {
print "reading filenames from STDIN\n" if $verbose;
@ARGV = <STDIN>;
chop(@ARGV);
}
for (@ARGV) {
my $was = $_;
eval $op;
die $@ if $@;
next if $was eq $_; # ignore quietly
if (-e $_ and !$force)
{
warn "$was not renamed: $_ already exists\n";
}
elsif ($no_act or rename $was, $_)
{
print "$was renamed as $_\n" if $verbose;
}
else
{
warn "Can't rename $was $_: $!\n";
}
}