bash
Способ хорош, но что , если вы работаете с оболочкой , которая не поддерживает расширение фигурной скобки? touch file{1..10}
не работает для меня, mksh
например. Вот три альтернативных способа, которые работают независимо от оболочки.
сл
Более нейтральным для оболочки подходом было бы объединить seq
команду, чтобы сгенерировать последовательность чисел, отформатированных с помощью printf
параметров, и передать ее 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()
функции создаем строку m, которая объединяет префикс (первый аргумент командной строки $ARGV[0]
) и заданное число, но заполняя число 4 нулями (что делается с помощью printf
-style форматирования, %04d
часть), и прикрепите .c
суффикс. В результате на каждой итерации мы создаем имя как bspl0001.c
.
open(my $fh, ">", $var);close($fh)
Эффективно действует как touch
команда, создавая файл с указанным именем.
Несмотря на то, что он немного длинный, он работает довольно хорошо, в моде похож на сценарий Якоба Влиима на 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