分割命令等效/替换,给出件数/部件总数?

分割命令等效/替换,给出件数/部件总数?

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";
    }
}

相关内容