a
에서 까지의 디렉토리를 표시해야 하는 방식으로 디렉토리를 생성하고 싶습니다 z
. 각 디렉토리 내에 하위 디렉토리를 생성하여 aa
등 으로 표시할 수 있도록 해야 합니다 .ab
예를 들어 디렉토리의 경우 내 하위 디렉토리에는 최대 까지 레이블 m
이 지정됩니다 .ma
mb
mz
답변1
노력하다:
for x in {a..z} ; do mkdir -p $x/${x}{a..z} ; done
Bash는 , 등 XXX{a..z}
으로 확장됩니다 . 가지고 있는 내부 루프가 필요하지 않습니다.XXXa
XXXb
이후:
$ ls
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
$ ls m
ma mc me mg mi mk mm mo mq ms mu mw my
mb md mf mh mj ml mn mp mr mt mv mx mz
답변2
따라서 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
모든 출력을 파이프로 스트리밍하면 모두 파일로 스트리밍됩니다. 전체 구성은 출력 파일을 한 번만 열고 닫습니다.for
done >file
for...done
답변3
~에서여기, 결국 이런 스크립트를 만들게 되었습니다. 그러나 우아한 해결책을 얻으면 그것을 답으로 받아들일 것입니다.
for x in {a..z}
do
mkdir -p /home/ramesh/$x
cd /home/ramesh/$x
for y in {a..z}
do
mkdir -p /home/ramesh/$x/$x$y
done
done
답변4
존재하다 Perl
:
perl -MFile::Path=make_path -e '
make_path(map { $l=$_; map { "$l/$l$_" } a..z } a..z)
'
File::Path
는 핵심 모듈이기 때문에 Perl 5.001
.