ディレクトリツリーを自動作成する方法


11

次のディレクトリが現在のディレクトリ内にあるディレクトリツリーをAからZに作成しようとしています。

たとえば、BはA内にあり、CはB内にあります。

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

自動化された方法でそれを達成する方法についての手がかりはありますか?


そのようなディレクトリの実用的な目的は何でしょうか。私見これはコードゴルフの質問のように見えます。
メレビウス

3
@Melebius考えられる目的の1つは、他のコマンド、スクリプト、またはアプリケーションが機能することを確認するために、テストケースとしてディレクトリ構造を作成することです。以下は、質問自体が特定のディレクトリ構造の作成に関するものではない最近の例です。しかし、そのためのコマンドの書き方を知ることは、特定の構造が不自然で奇妙であったにもかかわらず、それのためにテスト目的に役立ちました。(特定のディレクトリ構造の作成についても多くの質問があります。これは、「mkdir -p」を検索することで確認できます。)
エリアカガン

回答:


25

そしてbashののブレース展開:mkdirprintf

$ 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 を付けて出力するので、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:そのようなファイルやディレクトリはありません
ニッシュ

3
@Nish コマンド-pにはaがありmkdirます。
ムル

私の悪い、私はubuntuの代わりに私のMacでそれを試しました。そして、フォローアップの質問はこれです-> A内にA1..A100ディレクトリを(同じ構造AtoZで)持ちたいとしましょう。その後、B内のB1..B100です。このように見えます-> imgur.com/jfuKEdf
Nish

11
コメントではなく実際の質問としてフォローアップを投稿し、画像ではなくテキストを使用したとします。それははるかに良いでしょうか?
ムル

ここであなたの主張を理解しています。それをコードではなく、巨大な出力として投稿することは困難です。そのため、スクリーンショットを見るだけで理解しやすくなります。
ニッシュ

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ソート順はテキストベースであり、予想どおりの数値ではありません。限りtree、それを修正する方法はわかりませんtreeが、これは問題ではなく、むしろシェルのソート順でさえあると思います。unix.stackexchange.com
Sergiy Kolodyazhnyy

2

にもかかわらずmuruのprintf方法は、私個人的には同様のビートすることはできませんjotこの種のもののために。jotUbuntuにはデフォルトではインストールされません。athena-jotパッケージには、それを提供します。これらのコマンドのいずれかが機能します。

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

文字のシーケンスを生成し、スラッシュで結合するコマンドmkdir -pは、コマンドの置換muruのanswerのように)またはを使用して渡すことができるため、実際にこれが容易になります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

古いUbuntuリリースには、Python 3ではなくPython 2が付属しています。そのため、Pythonで本当にこれを行うには、最後のコマンドが機能するように変更python3pythonてください。

同様に、muruの短く簡単な方法は、代わりに書くことができます:

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

/ディレクトリパス内の末尾のmkdir -pを作成するように求められますが、問題はなく、おそらくスタイル的に好ましいです。ただし、この回答の他の例と同様に、省略しても構いません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.