Các bashcá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 mkshchẳ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 seqlệnh để tạo ra chuỗi số được định dạng với printfcác tùy chọn và chuyển nó sang xargslệ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 printfkiểu định dạng, %04dmột phần) và đính kèm hậu .ctố. 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ư touchlệ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ù awkchủ 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