따라서 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|commandwill를 추가하면 for동일한 방식으로 파이프를 통해 모든 루프의 출력을 done >file스트림으로 전체 파일에 스트리밍합니다 for...done. 전체 구성에 대해 출력 파일을 한 번만 열고 닫습니다 .