Der bash
Weg ist gut, aber was ist, wenn Sie mit einer Shell arbeiten, die die Erweiterung der geschweiften Klammer nicht unterstützt? touch file{1..10}
funktioniert bei mir mksh
zum Beispiel nicht. Hier sind drei alternative Möglichkeiten, die unabhängig von der Shell funktionieren.
seq
Ein eher shellneutraler Ansatz wäre, den seq
Befehl zu kombinieren , um eine mit printf
Optionen formatierte Folge von Zahlen zu generieren , und ihn an den xargs
Befehl weiterzuleiten . Zum Beispiel,
$ 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
Natürlich kann Perl, ein weit verbreitetes * nix-Tool, das auch. Der spezifische Einzeiler-Befehl, den wir hier haben, ist der folgende:
perl -le 'do { $var=sprintf("%s%04d.c",$ARGV[0],$_ ); open(my $fh, ">", $var);close($fh) } for $ARGV[1] .. $ARGV[2]' bslp 1 5
Im Grunde genommen werden hier drei Befehlszeilenargumente angegeben: Dateinamenpräfix, Startindex und Endindex. Anschließend do { } for $ARGV[1] .. $ARGV[2]
iterieren wir für einen bestimmten Zahlenbereich. Sagen wir , $ARGV[1]
war 5 und $ARGV[2]
war 9, wir würden über 5,6,7,8 und 9 iterieren.
Was passiert bei jeder Iteration innerhalb der geschweiften Klammern? Wir nehmen jede mit angegebene Zahl $_
und sprintf()
erstellen mit function einen String m, der das Präfix (erstes Kommandozeilenargument $ARGV[0]
) und die angegebene Zahl printf
aufteilt , aber die Zahl mit 4 Nullen auffüllt (dies geschieht durch -Stil der Formatierung). %04d
Teil), und fügen Sie das .c
Suffix. Als Ergebnis auf jeder Iteration bilden wir einen Namen wie bspl0001.c
.
Das open(my $fh, ">", $var);close($fh)
fungiert effektiv als touch
Befehl und erstellt eine Datei mit dem angegebenen Namen.
Obwohl es ein wenig lang ist, funktioniert es recht gut, ähnlich wie das Python-Skript von Jacob Vlijm. Auf Wunsch kann es auch zur besseren Lesbarkeit in ein Skript konvertiert werden:
#!/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 ;
}
Lass uns das testen. Zuerst der Einzeiler:
$ 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
Und jetzt das Drehbuch:
$ 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
Ein anderer Ansatz wäre awk
, eine for-Schleife auszuführen und zu einer bestimmten Datei umzuleiten. Der Ansatz ähnelt dem Perl-Einzeiler mit Befehlszeilenargumenten. Während awk
es sich in erster Linie um ein Textverarbeitungsprogramm handelt, kann es dennoch einige coole Systemprogrammierungen durchführen.
$ 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