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 เป็นเครื่องมือที่เป็นเครื่องมือในการสร้างคำศัพท์ * ซึ่งสามารถทำสิ่งนั้นได้เช่นกัน คำสั่งหนึ่งซับที่เฉพาะเจาะจงที่เรามีที่นี่มีดังต่อไปนี้:
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 ซึ่ง splices อัพคำนำหน้า (อาร์กิวเมนต์บรรทัดคำสั่งแรก$ARGV[0]) , และหมายเลขที่กำหนด, แต่เติมตัวเลขด้วย 4 ศูนย์ (ซึ่งทำโดยprintf- สไตล์ของการจัดรูปแบบ, %04dส่วนหนึ่ง) และแนบคำต่อ.cท้ายผลลัพธ์ของการวนซ้ำแต่ละครั้งจึงทำให้ชื่อคล้ายbspl0001.cกัน
open(my $fh, ">", $var);close($fh)ได้อย่างมีประสิทธิภาพทำหน้าที่เป็นtouchคำสั่งการสร้างไฟล์ที่มีชื่อระบุ
ในขณะที่ความยาวเล็กน้อยมันทำงานได้ค่อนข้างดีในลักษณะคล้ายกับสคริปต์หลามของ Jacob Vlijm นอกจากนี้ยังสามารถแปลงเป็นสคริปต์เพื่อให้สามารถอ่านได้หากต้องการเช่น:
#!/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ใช้สำหรับการวนรอบการเปลี่ยนเส้นทางไปยังไฟล์ที่ระบุ วิธีนี้คล้ายกับ perl one-liner ที่มีอาร์กิวเมนต์บรรทัดคำสั่ง ในขณะที่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