따라서 bash
알파벳 확장 기능을 사용하면 다음과 같이 작동합니다.
set {a..z}
for a do printf "./$a/$a%s\n" "$@"
done | xargs mkdir -p
그리고 첫 번째 줄에 알파벳을 한 번만 입력하면 동일한 개념이 모든 쉘에 이식 가능해야합니다. 다음과 같이 입력하지 않으려면 세트 라인에 도달하는 다른 방법이 있습니다.
seq -sP32P 97 123|dc
a b c d e f g h i j k l m n o p q r s t u v w x y z
... 예를 들어 ASCII 로케일에서 작동합니다. 따라서 필요한 인수 set $(seq -sP32P 97 123|dc)
의 $IFS
분리 된 목록을 얻을 수있는 다른 명령을 수행 할 수는 있지만 bash
물건 을 사용 하거나 입력 하는 것이 더 좋습니다 .
어쨌든, 나는 그것이 필요할 때만 mkdir
자주 호출하기 때문에 내가 할 수있는 방법이라고 생각 합니다.
작동 방식 을 보여 주기 위해 작은 세트의 작은 디버그 출력이 있습니다.
sh -cx 'for n do printf "./$n/$n%s\n" "$@"; done|cat' -- arg1 arg2 arg3
+ for n in '"$@"'
+ printf './arg1/arg1%s\n' arg1 arg2 arg3
+ cat
+ for n in '"$@"'
+ printf './arg2/arg2%s\n' arg1 arg2 arg3
+ for n in '"$@"'
+ printf './arg3/arg3%s\n' arg1 arg2 arg3
./arg1/arg1arg1
./arg1/arg1arg2
./arg1/arg1arg3
./arg2/arg2arg1
./arg2/arg2arg2
./arg2/arg2arg3
./arg3/arg3arg1
./arg3/arg3arg2
./arg3/arg3arg3
보시다시피, for
위치 매개 변수 배열 인덱스 당 한 번만 반복 sh
됩니다 set ${positionals}
. 이 매개 변수는 호출시 매개 변수를 넘겨서 설정합니다 . 그러나 printf
각 반복에 대해 인수 목록에서 동일한 배열을 수신하고 형식 문자열을 각 인수에 적용하므로 불필요한 재귀없이 재귀 모양을 얻을 수 있습니다.
그리고 done|command
will를 추가하면 for
동일한 방식으로 파이프를 통해 모든 루프의 출력을 done >file
스트림으로 전체 파일에 스트리밍합니다 for...done
. 전체 구성에 대해 출력 파일을 한 번만 열고 닫습니다 .