bash
Droga jest dobra, ale co, jeśli pracujesz z powłoki, która nie obsługuje kręcone rozwijanie nawiasów? touch file{1..10}
na mksh
przykład nie działa dla mnie . Oto trzy alternatywne sposoby działania niezależnie od powłoki.
seq
Bardziej neutralne dla powłoki podejście byłoby połączenie seq
polecenia w celu wygenerowania sekwencji liczb sformatowanych za pomocą printf
opcji i przekazania jej do xargs
polecenia. Na przykład,
$ 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
Oczywiście Perl, który jest dość rozpowszechnionym narzędziem * nix, może to zrobić. Konkretne polecenie jednowierszowe, które tutaj mamy, jest następujące:
perl -le 'do { $var=sprintf("%s%04d.c",$ARGV[0],$_ ); open(my $fh, ">", $var);close($fh) } for $ARGV[1] .. $ARGV[2]' bslp 1 5
W efekcie podajemy 3 argumenty wiersza polecenia: przedrostek nazwy pliku, indeks początkowy i indeks końcowy. Następnie używamy do { } for $ARGV[1] .. $ARGV[2]
iteracji dla określonego zakresu liczb. Powiedzmy, że $ARGV[1]
było 5 i $ARGV[2]
było 9, będziemy powtarzać ponad 5,6,7,8 i 9.
Co dzieje się podczas każdej iteracji w nawiasach klamrowych? bierzemy każdą liczbę określoną za $_
pomocą i za pomocą sprintf()
funkcji tworzymy ciąg m, który dzieli przedrostek (pierwszy argument wiersza poleceń $ARGV[0]
) i podaną liczbę, ale wypełniając liczbę 4 zerami (co odbywa się poprzez printf
styl formatowania, %04d
część) i dołącz .c
sufiks. W wyniku każdej iteracji tworzymy nazwę jak bspl0001.c
.
open(my $fh, ">", $var);close($fh)
Skutecznie działa jako touch
polecenia, tworząc plik o określonej nazwie.
Choć jest nieco długi, działa całkiem dobrze, podobnie jak skrypt Pythona Jacoba Vlijma. W razie potrzeby można go również przekonwertować na skrypt, aby był czytelny:
#!/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 ;
}
Sprawdźmy to. Najpierw jedna linijka:
$ 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
A teraz skrypt:
$ 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
Inne podejście polegałoby na awk
uruchomieniu pętli for i przekierowaniu do określonego pliku. Podejście jest podobne do jednowierszowego perla z argumentami wiersza poleceń. Chociaż awk
jest to przede wszystkim narzędzie do przetwarzania tekstu, nadal może robić fajne programowanie systemowe.
$ 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