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


12

나는에서 디렉토리 레이블을해야한다는 등의 방법으로 디렉토리를 생성 할 a로를 z. 각각의 디렉토리 안에서, 나는 그들이으로 표시되도록 하위 디렉토리를 작성해야합니다 aa, ab

예를 들어, 디렉토리의 m경우 내 하위 디렉토리 ma에는 mbupto 로 레이블이 지정됩니다 mz.


3
-p가 서브 디렉토리도 작성하기 때문에 첫 번째 mkdir이 필요하지 않습니다. abolute 경로를 사용하는 경우 cd 명령이 필요하지 않습니다. 그렇지 않으면 훌륭하고 작동하며 변수가 선언됩니다. Michael Homer의 버전이 더 짧고 성능이 더 좋을 수 있지만 간단한 작업의 경우 충분합니다.

1
당시에는 더 많은 termininfo 항목이 있었고 bash {a..z} 구문이 없었으므로 /usr/share/terminfo[az]로 나열하고 해당 출력을 사용합니다. 리눅스는 그 숫자가 매우 적으며, 모든 대문자와 소문자에 숫자를 더한 항목이었습니다.
schemathings

답변:


19

시험:

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

강타는 확장됩니다 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

7

따라서 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. 전체 구성에 대해 출력 파일을 한 번만 열고 닫습니다 .


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

+1, 좋은 질문과 더 나은 답변 :)
Nidal

@Networker, 이것보다 꽤 좋은 해결책이 있다고 확신합니다. 이 답변과 비슷한 작업을 수행하지만 훨씬 더 시원하게 보일 전문가의 답변을 기다리는 중 :)
Ramesh

엄밀히 말하면 변수 값이 무엇인지 알 때 (그리고 단순한 문자열 임) 필요하지는 않지만 변수를 인용하는 습관을들이는 것이 좋습니다. 당신은 사용할 수 있습니다 /home/ramesh/"$x"/"$x$y", /home/ramesh/"$x/$x$y"또는 "/home/ramesh/$x/$x$y"그들은 모두 동등한 것 -.
Scott

1

에서 Perl:

perl -MFile::Path=make_path -e '
    make_path(map { $l=$_; map { "$l/$l$_" } a..z } a..z)
'

File::Path이후 핵심 모듈 Perl 5.001입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.