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
стилі форматування, %04d
частина), і прикріпіть .c
суфікс. В результаті кожної ітерації ми складаємо ім’я на зразок bspl0001.c
.
open(my $fh, ">", $var);close($fh)
Ефективно діє як touch
команда, створюючи файл із зазначеним ім'ям.
Хоча трохи тривалий, він працює досить добре, в моді схожий на сценарій пітона Якова Влійма. Він також може бути перетворений в сценарій для читабельності за бажанням, наприклад:
#!/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