bash
あなたはカーリーブレース展開をサポートしていないシェルを使用している場合の方法は良いですが、何?たとえばtouch file{1..10}
、私にとってはうまくいきませんmksh
。シェルに関係なく機能する3つの代替方法を次に示します。
seq
よりシェルに中立なアプローチは、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
Perl
もちろん、Perlは広く普及している* nixツールであるため、同様にそれを行うことができます。ここにある特定のワンライナーコマンドは次のとおりです。
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()
関数を使用して、プレフィックス(最初のコマンドライン引数$ARGV[0]
)と指定された番号をつなぐ文字列mを作成しますが、番号を4つのゼロで埋めます(printf
-style of format によって行われます、%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 one-linerに似ています。一方で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