모든 문자에 대한 디렉토리를 반복적으로 생성

모든 문자에 대한 디렉토리를 반복적으로 생성

a에서 까지의 디렉토리를 표시해야 하는 방식으로 디렉토리를 생성하고 싶습니다 z. 각 디렉토리 내에 하위 디렉토리를 생성하여 aa등 으로 표시할 수 있도록 해야 합니다 .ab

예를 들어 디렉토리의 경우 내 하위 디렉토리에는 최대 까지 레이블 m이 지정됩니다 .mambmz

답변1

노력하다:

for x in {a..z} ; do mkdir -p $x/${x}{a..z} ; done

Bash는 , 등 XXX{a..z}으로 확장됩니다 . 가지고 있는 내부 루프가 필요하지 않습니다.XXXaXXXb

이후:

$ 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여기에서 설정했습니다 . 그러나 각 반복은 매개변수 목록에서 동일한 배열을 받고 해당 형식 문자열을 적용합니다. 각 인수에 추가하므로 불필요한 재귀 없이 재귀 모양을 얻을 수 있습니다.shset ${positionals}printf

그리고 동일한 방식으로 루프의 done|command모든 출력을 파이프로 스트리밍하면 모두 파일로 스트리밍됩니다. 전체 구성은 출력 파일을 한 번만 열고 닫습니다.fordone >filefor...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.

관련 정보