该bash
方法是好的,但如果你用的是不支持大括号扩展外壳的工作?例如touch file{1..10}
对我不起作用mksh
。这是三种与外壳无关的替代方法。
序列
一种与外壳无关的方法是将seq
命令组合以生成使用printf
options 格式化的数字序列,并将其传递给xargs
命令。例如,
$ ls -l
total 0
$ seq -f "%04.0f" 10 | xargs -I "{}" touch bspl"{}".c
$ ls
bspl0002.c bspl0004.c bspl0006.c bspl0008.c bspl0010.c
bspl0001.c bspl0003.c bspl0005.c bspl0007.c bspl0009.c
佩尔
当然,作为相当广泛的* nix工具,Perl也可以做到这一点。我们在此处具有的特定一线命令如下:
perl -le 'do { $var=sprintf("%s%04d.c",$ARGV[0],$_ ); open(my $fh, ">", $var);close($fh) } for $ARGV[1] .. $ARGV[2]' bslp 1 5
实际上,这里发生的事情是我们指定了3个命令行参数:文件名前缀,开始索引和结束索引。然后,我们用于do { } for $ARGV[1] .. $ARGV[2]
迭代特定范围的数字。假设分别$ARGV[1]
是5 $ARGV[2]
岁和9岁,我们将迭代5、6、7、8和9。
花括号内的每次迭代会发生什么?我们使用以指定的每个数字$_
,并使用sprintf()
函数创建一个字符串m,该字符串拼接起前缀(第一个命令行参数$ARGV[0]
)和给定的数字,但用4个零填充该数字(通过printf
-style-formatting格式完成,%04d
部分),并附加.c
后缀。每次迭代的结果都是我们命名为bspl0001.c
。
将open(my $fh, ">", $var);close($fh)
有效地充当touch
命令,创建具有指定名称的文件。
尽管有点冗长,但它的表现相当不错,其方式类似于Jacob Vlijm的python脚本。如果需要,还可以将其转换为脚本以提高可读性,例如:
#!/usr/bin/env perl
use strict;
use warnings;
for my $i ( $ARGV[1] .. $ARGV[2] ) {
my $var=sprintf("%s%04d.c",$ARGV[0],$i );
open(my $fh, ">", $var) or die "Couldn't open " . $var ;
close($fh) or die "Couldn't close " . $var ;
}
让我们测试一下。首先是单线:
$ ls -l
total 0
$ perl -le 'do { $var=sprintf("%s%04d.c",$ARGV[0],$_ ); open(my $fh, ">", $var);close($fh) } for $ARGV[1] .. $ARGV[2]' bslp 1 5
$ ls -l
total 0
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:36 bslp0001.c
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:36 bslp0002.c
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:36 bslp0003.c
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:36 bslp0004.c
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:36 bslp0005.c
现在是脚本:
$ ls -l
total 4
-rwxrwxr-x 1 xieerqi xieerqi 244 2月 5 23:57 touch_range.pl*
$ ./touch_range.pl bspl 1 5
$ ls -l
total 4
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:58 bspl0001.c
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:58 bspl0002.c
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:58 bspl0003.c
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:58 bspl0004.c
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:58 bspl0005.c
-rwxrwxr-x 1 xieerqi xieerqi 244 2月 5 23:57 touch_range.pl*
awk
另一种方法是awk
运行for循环,重定向到特定文件。该方法类似于带有命令行参数的perl单行代码。虽然awk
主要是文本处理实用程序,但它仍然可以执行一些很酷的系统编程。
$ awk 'BEGIN{for(i=ARGV[2];i<=ARGV[3];i++){fd=sprintf("%s%04d.c",ARGV[1],i); printf "" > fd;close(fd)}}' bslp 1 5