Các bash
cách là tốt, nhưng những gì nếu bạn đang làm việc với một lớp vỏ mà không hỗ trợ việc mở rộng cú đúp xoăn? touch file{1..10}
không làm việc cho tôi mksh
chẳng hạn. Đây là ba cách thay thế hoạt động bất kể vỏ.
seq
Một cách tiếp cận trung tính vỏ hơn sẽ là kết hợp seq
lệnh để tạo ra chuỗi số được định dạng với printf
các tùy chọn và chuyển nó sang xargs
lệnh. Ví dụ,
$ 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
Tất nhiên, Perl, là một công cụ * nix khá phổ biến, cũng có thể làm điều đó. Lệnh one-liner cụ thể mà chúng ta có ở đây là như sau:
perl -le 'do { $var=sprintf("%s%04d.c",$ARGV[0],$_ ); open(my $fh, ">", $var);close($fh) } for $ARGV[1] .. $ARGV[2]' bslp 1 5
Thực tế, điều xảy ra ở đây là chúng tôi chỉ định 3 đối số dòng lệnh: tiền tố tên tệp, chỉ mục bắt đầu và chỉ mục kết thúc. Sau đó, chúng tôi sử dụng do { } for $ARGV[1] .. $ARGV[2]
để lặp cho một phạm vi số cụ thể. Nói, $ARGV[1]
là 5 và $ARGV[2]
là 9, chúng tôi sẽ lặp lại trên 5,6,7,8 và 9.
Điều gì xảy ra trên mỗi lần lặp trong niềng răng xoăn? chúng tôi lấy từng số được chỉ định $_
và sử dụng sprintf()
hàm tạo một chuỗi m để tách tiền tố (đối số dòng lệnh đầu tiên $ARGV[0]
) và số đã cho, nhưng điền vào số đó bằng 4 số không (được thực hiện theo printf
kiểu định dạng, %04d
một phần) và đính kèm hậu .c
tố. Kết quả trên mỗi lần lặp chúng ta tạo thành một tên như thế nào bspl0001.c
.
Hiệu open(my $fh, ">", $var);close($fh)
quả hoạt động như touch
lệnh, tạo một tệp với tên được chỉ định.
Mặc dù hơi dài nhưng nó hoạt động khá tốt, theo kiểu tương tự kịch bản python của Jacob Vlijm. Nó cũng có thể được chuyển đổi thành một tập lệnh để dễ đọc nếu muốn, như vậy:
#!/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 ;
}
Hãy kiểm tra điều này. Đầu tiên một lớp lót:
$ 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
Và bây giờ là kịch bản:
$ 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*
ôi
Một cách tiếp cận khác sẽ là awk
, chạy một vòng lặp for, chuyển hướng đến một tệp cụ thể. Cách tiếp cận tương tự như perl one-liner với các đối số dòng lệnh. Mặc dù awk
chủ yếu là một tiện ích xử lý văn bản, nó vẫn có thể thực hiện một số chương trình hệ thống thú vị.
$ 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