bash
Eğer küme ayracı genişleme desteklemeyen bir kabuk ile çalışıyorsanız yolu iyidir, ama ne? Mesela touch file{1..10}
benim için çalışmıyor mksh
. İşte kabuktan bağımsız olarak çalışan üç alternatif yol.
seq
Kabuk-nötr bir yaklaşım seq
, printf
seçeneklerle biçimlendirilmiş sayı dizisini üretmek için komutu birleştirmek ve onu xargs
komuta geçirmek olacaktır . Örneğin,
$ 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
Tabii ki, Perl, oldukça yaygın bir * nix aracı olarak bunu da yapabilir. Burada sahip olduğumuz belirli bir liner komutu şöyledir:
perl -le 'do { $var=sprintf("%s%04d.c",$ARGV[0],$_ ); open(my $fh, ">", $var);close($fh) } for $ARGV[1] .. $ARGV[2]' bslp 1 5
Burada etkili olan, 3 komut satırı argümanını belirtmemiz: dosyaadı öneki, başlangıç dizini ve bitiş dizini. Sonra do { } for $ARGV[1] .. $ARGV[2]
belirli bir sayı aralığı için yineleme yapmak için kullanırız . Diyelim ki, $ARGV[1]
5 ve $ARGV[2]
9 idi, 5,6,7,8 ve 9'un üzerinde tekrar ederdik.
Kıvrımlı ayraçlar içindeki her yinelemede ne olur? ile belirtilen her sayıyı alırız $_
ve sprintf()
işlevi kullanarak önek (ilk komut satırı argümanı $ARGV[0]
) ile verilen sayıyı birleştiren bir m dizgisi yaratırız , ancak sayıyı 4 sıfır ile doldururuz ( printf
biçimlendirme stiline göre yapılır , %04d
parçası) ve son .c
ekini ekleyin bspl0001.c
.
open(my $fh, ">", $var);close($fh)
Etkin bir şekilde davranan touch
Belirtilen ada sahip bir dosya oluşturarak, komuta.
Biraz uzun olsa da, Jacob Vlijm'in python senaryosuna benzer bir şekilde, oldukça iyi bir performans sergiliyor. Ayrıca istenirse okunabilirlik için bir komut dosyasına dönüştürülebilir, şöyle:
#!/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 ;
}
Bunu test edelim. İlk önce tek gömlek:
$ 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
Ve şimdi senaryo:
$ 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
Başka bir yaklaşım ise awk
for döngüsünü çalıştırarak belirli bir dosyaya yönlendirme yapmak olabilir. Yaklaşım, komut satırı argümanları ile perl one-liner'a benzer. İken awk
öncelikle bir metin işleme aracıdır, hala bazı serin sistem programlama yapabilirsiniz.
$ 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