bash
당신은 중괄호 확장을 지원하지 않는 쉘 작업하는 경우 방법은 좋은,하지만? 예를 들어 touch file{1..10}
나를 mksh
위해 작동하지 않습니다 . 쉘에 관계없이 작동하는 세 가지 대체 방법이 있습니다.
순서
보다 중립적 인 접근 방식은 seq
command 를 결합 하여 printf
options 형식의 일련의 숫자를 생성 하여 command에 전달하는 것 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
펄
물론, 매우 광범위한 * nix 도구 인 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()
함수는 프리픽스 (제 1 명령 줄 인수 최대 스플 라이스 문자열 m 생성 $ARGV[0]
)하고 지정된 수 있지만, 수행 4 0으로 번호 (채우고 printf
, 서식의 스타일을 %04d
부분), .c
접미사를 첨부합니다 . 각 반복의 결과로 우리는 같은 이름을 구성합니다 bspl0001.c
.
는 open(my $fh, ">", $var);close($fh)
효과적으로 역할을 touch
지정된 이름의 파일을 생성, 명령.
약간 길지만 Jacob Vlijm의 python 스크립트와 비슷한 방식으로 성능이 뛰어납니다. 원하는 경우 가독성을 위해 스크립트로 변환 할 수도 있습니다.
#!/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*
어 wk
또 다른 방법은 awk
for 루프를 실행하여 특정 파일로 리디렉션하는 것입니다. 이 접근 방식은 명령 줄 인수가있는 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