디렉토리 트리를 작성하는 자동화 된 방법


11

다음 디렉토리가 현재 디렉토리 내에있는 A에서 Z까지 디렉토리 트리를 만들려고합니다.

예를 들어 : B는 A 내에 있고 C는 B 안에 있습니다.

-A
--B
---C
----...Z

자동화 된 방법을 얻는 방법에 대한 단서가 있습니까?


그러한 디렉토리의 실제 목적이 무엇인지 궁금합니다. IMHO 이것은 Code Golf에 대한 질문처럼 보입니다 .
Melebius

3
@Melebius 하나의 가능한 목적은 다른 명령, 스크립트 또는 응용 프로그램이 속성을 작동하는지 확인하기 위해 테스트 사례로 디렉토리 구조를 만드는 것입니다. 다음 은 질문 자체가 특정 디렉토리 구조를 작성하는 것이 아니라 명령을 작성하는 방법을 아는 것이 특정 구조가 어떻게 구성되고 기묘한 지에 관계없이 테스트 목적에 유용하지만 그 이유 때문에 최근에 발생한 사례 입니다. ( " mkdir -p" 를 검색하여 찾을 수있는 특정 디렉토리 구조를 만드는 방법에 대해서도 많은 질문이 있습니다 .)
Eliah Kagan

답변:


25

과 bash의 괄호 확장을 사용 mkdir하면 다음 printf과 같습니다.

$ mkdir -p "$(printf "%s/" {A..Z})"
$ tree A
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

25 directories, 0 files
  • {A..Z}에 확장 A B ... Z,
  • printf "%s/"/뒤에 인수를 사용하여 인수를 인쇄 하므로A/B/...Z/
  • mkdir -p생성 A/B/.../Z생성 필요한 부모 디렉토리와 디렉토리를.

고마워 동안이 오류가 발생했다고 생각했습니다. mkdir 명령을 사용합니다 : 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 : 해당 파일 또는 디렉토리가 없음
Nish

3
@Nish a는있다 -p에서 mkdir명령.
muru

내 나쁜, 나는 우분투 대신 내 맥에서 그것을 시도했다. 그리고 후속 질문은 이것입니다.> A 내에 A1..A100 디렉토리를 갖고 싶다고 가정 해 봅시다 (동일한 구조의 AtoZ). 그런 다음 B 내의 B1..B100. 따라서 다음과 같이 보입니다-> imgur.com/jfuKEdf
Nish

11
댓글 대신 후속 질문을 실제 질문으로 게시하고 이미지가 아닌 텍스트를 사용했다고 가정 해 봅시다. 훨씬 나아질까요?
muru

나는 당신의 요점을 이해합니다. 코드가 아닌 거대한 출력으로 게시하기가 어렵습니다. 따라서 단순히 스크린 샷을 보면 이해하기 쉽습니다.
Nish

7

매우 간단한 수준에서 {A..Z}확장을 사용하여 모든 문자를 생성 한 다음 반복적으로 각 문자를 만들고 입력 할 수 있습니다.

~/test_directory$ for d in {A..Z}; do mkdir "$d"; cd "$d"; done
~/test_directory/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$ 

내 프롬프트 출력에서 ​​볼 수 있듯이 이제 완전히 연결된 디렉토리가 있습니다.

그러나 실제 디렉토리 이름이 알파벳과 다른 경우 파일을 통해 디렉토리 이름 목록을 제공해야합니다. 파일을 통해 동일한 프로세스를 반복하고 다시 수행해야합니다. 기본적으로이

while IFS= read -r dir_name;do mkdir "$dir_name"; cd "$dir_name" ;done < directory_list.txt

꽤 괜찮은데. 후속 질문이 있습니다. A 내에 A1..A100 디렉토리를 갖고 싶다고 가정 해 봅시다 (동일한 구조의 AtoZ). 그런 다음 B 내 B1..B100입니다. 따라서 다음과 같이 보입니다.-> imgur.com/jfuKEdf
Nish

@Nish 아, 그것은 내부 루프가 필요합니다for d in {A..Z}; do mkdir "$d"; cd "$d"; for i in {1..100}; do mkdir "${d}${i}" ;done ; done
Sergiy Kolodyazhnyy

또는 내부 루프가없는 경우에도for d in {A..Z}; do mkdir "$d"; cd "$d"; mkdir "$d"{1..100}; done
Sergiy Kolodyazhnyy

고마워 그것은 작동하는 것처럼 보이지만 디렉토리의 순서는 망가 져서 2는 1 이후가 아닙니다. 무작위로 정렬됩니다. 어쨌든 그것을 고치기 위해? 스크린 샷은 다음과 같습니다-> imgur.com/a/Zqj1c
Nish

@Nish 정렬 순서는 텍스트 기반이며 숫자가 아닌 숫자입니다. 까지는 tree문제를 해결하는 방법을 잘 모르겠지만 이것이 tree문제가 아니라 쉘의 정렬 순서 라고 생각합니다 . 나는 여기에 또는 더 나은 unix.stackexchange.com에 대한 실제 질문을 제안하는 것이 좋습니다
Sergiy Kolodyazhnyy

2

비록 muru의 printf방법은 , 내가 개인적으로 좋아 이길 수없는 jot것은 이런 종류의합니다. jot우분투에는 기본적으로 설치되어 있지 않습니다. athena-jot패키지를 제공합니다. 다음 명령 중 하나가 작동합니다.

mkdir -p "$(jot -s/ -c 26 A)"
jot -s/ -c 26 A | xargs mkdir -p

출력은 다음에 전달 될 수 있기 때문에 정말 문자의 시퀀스를 생성하고 슬래시로 합류 모든 명령이 용이합니다 mkdir -p통해서 명령 치환 (같이 muru의 대답 ) 또는 사용 xargs. 다음은 몇 가지 도구를 사용하는 예이며 xargs매우 작은 시스템이나 Ubuntu Core를 제외하고는 소프트웨어를 설치할 필요가 없습니다.

perl -we 'print join "/", A..Z' | xargs mkdir -p
ruby -we 'print (?A..?Z).to_a * ?/' | xargs mkdir -p
python3 -c 'print("/".join(__import__("string").ascii_uppercase))' | xargs mkdir -p

오래된 우분투 버전은 변경, 파이썬이 대신 그 내용은 파이썬 3와 함께 python3하는 python당신이 정말 파이썬이 작업을 수행하려면, 마지막 명령 작업을 할 수 있습니다.

마찬가지로 muru의 짧고 간단한 방법 은 다음 같이 작성할 수 있습니다.

printf '%s/' {A..Z} | xargs mkdir -p

/디렉토리 경로에서 후행 mkdir -p을 작성하도록 요청하면 아무런 문제가 없으며 문체 적으로 바람직합니다. 그러나이 답변의 다른 예와 마찬가지로 생략해도 좋습니다.

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