自动创建目录树的方式


11

我正在尝试从A到Z创建目录树,其中下一个目录在当前目录内。

例如:B在A内,C在B内,依此类推。

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

关于如何以自动化方式完成操作的任何线索?


我想知道这些目录的实际用途是什么。恕我直言,这更像是Code Golf的问题。
Melebius

3
@Melebius一个可能的目的是创建一个目录结构作为测试用例,以帮助验证其他命令,脚本或应用程序是否可以正常工作。在最近一个实例中,问题本身不是关于创建特定的目录结构,而是知道如何编写命令这样做对于测试目的很有用,而不是因为特定结构是如何设计和怪异的,而是因为它。(关于创建特定的目录结构,我们还有很多问题,可以通过搜索“ mkdir -p”找到。)
Eliah Kagan

Answers:


25

使用mkdirprintf和bash的大括号扩展:

$ 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有一个-pmkdir命令。
muru

不好的是,我在Mac上而不是ubuntu上尝试了。接下来的问题是->假设我想在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
谢尔盖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问题,而是shell的排序顺序。我建议在unix.stackexchange.com上询问有关此问题的实际问题或更好的问题
Sergiy Kolodyazhnyy

2

即使无法克服木鲁的printf方法,我个人也喜欢jot这种事情。jot在Ubuntu中默认未安装。该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

旧的Ubuntu版本来与Python 2而不是Python 3的对于这一点,只需要改变python3,以python使那最后命令的工作,如果你真的想用Python来做到这一点。

类似地,可以选择写muru的简短方法

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

要求/在目录路径mkdir -p中创建尾随,这没问题,并且在样式上可以说是更可取的。但是可以忽略它,就像该答案中的其他示例一样。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.