bash
जिस तरह से अच्छा है, लेकिन क्या अगर आप एक खोल कि घुंघराले ब्रेस विस्तार का समर्थन नहीं करता के साथ काम कर रहे हैं? उदाहरण के touch file{1..10}
लिए मेरे लिए काम नहीं करता है mksh
। यहां तीन वैकल्पिक तरीके हैं जो शेल की परवाह किए बिना काम करते हैं।
seq
विकल्पों के 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 -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()
फ़ंक्शन का उपयोग करते हुए एक स्ट्रिंग मी बनाते हैं जो उपसर्ग (पहली कमांड-लाइन तर्क $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
, एक लूप के लिए चल रहा है, एक विशिष्ट फ़ाइल पर पुनर्निर्देशित करना। दृष्टिकोण कमांड-लाइन तर्कों के साथ पर्ल वन-लाइनर के समान है। जबकि 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