То bash
способ хорош, но что, если вы работаете с оболочкой, которая не поддерживает расширение фигурных скобок? touch file{1..10}
не работает для меня на mksh
например. Вот три альтернативных способа, которые работают независимо от оболочки.
след.
Более нейтральным к оболочке подходом было бы объединить seq
команда для генерации последовательности чисел, отформатированных с помощью printf
параметры и передайте его в xargs
команда. Например,
$ ls -ltotal 0$ seq -f "%04.0f" 10 | xargs -I "{}" touch bspl"{}".c $ lsbspl0002.c bspl0004.c bspl0006.c bspl0008.c bspl0010.cbspl0001.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
-стиль форматирования , %04d
часть), и прикрепите .c
суффикс.В результате на каждой итерации мы создаем имя, подобное bspl0001.c
.
То open(my $fh, ">", $var);close($fh)
эффективно действует как touch
команда, создающая файл с указанным именем.
Несмотря на небольшую длину, он работает довольно хорошо, аналогично скрипту Джейкоба Влийма на python. При желании он также может быть преобразован в скрипт для удобства чтения, например:
#!/usr/bin/env perluse 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 -ltotal 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 -ltotal 4-rwxrwxr-x 1 xieerqi xieerqi 244 2月 5 23:57 touch_range.pl*$ ./touch_range.pl bspl 1 5 $ ls -ltotal 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