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