【问题标题】:Creating Hierarchical Directory Tree From Compact String Representation从紧凑的字符串表示创建层次目录树
【发布时间】:2016-07-19 10:28:21
【问题描述】:

我知道我可以通过一系列相当冗长的mkdir -p 创建一系列嵌套目录,并应用-p 标志来抑制目录已存在的警告。这对于单独的调用变得非常冗长,即:

mkdir -p hello
mkdir -p hello/i_am_a
mkdir -p hello/i_am_a/boy
mkdir -p hello/i_am_a/girl
mkdir -p hello/i_am_a/alien
mkdir -p hello/i_am_a/dog
mkdir -p hello/my_name_is
mkdir -p hello/my_name_is/jim
mkdir -p hello/my_name_is/bob
mkdir -p hello/my_name_is/secret

我想在单个调用中构建树或至少部分树,其中嵌套模式由列表打开字符(即{)、列表分隔符(即,)组成。,和列表结束字符(即})。

对于从顶部开始的每个级别,如果该名称的目录尚不存在,则会创建该目录。

要继续我上面用真实单词的愚蠢示例,我将使用输入字符串:

'你好{i_am_a{boy,girl,alien,dog},my_name_is{jim,bob,secret}}'

...应该创建以下...

hello
hello/i_am_a
hello/i_am_a/boy
hello/i_am_a/girl
hello/i_am_a/alien
hello/i_am_a/dog
hello/my_name_is
hello/my_name_is/jim
hello/my_name_is/bob
hello/my_name_is/secret

为方便起见,假设如果它影响解决方案的长度,我们可以假设结果树中的嵌套层数不超过n(例如,上面我的示例中的n=3)。

为了方便,让我们进一步假设三个特殊结构字符(在上面的示例中,例如{,})永远不会出现在嵌套字符串中,即它们永远不会出现在生成的文件路径中。

似乎PerlPython 嵌入式脚本可以解决问题,但也许有一个使用内置BASH 功能的更简单的解决方案?

我的目标是一个简洁的解决方案,减少我的数据后处理脚本的冗长,这通常涉及创建分层目录树,其中包含我保存以供重复使用的中间体以及目录中的最终结果填充在更深层次朝着树的顶端。

【问题讨论】:

  • 您在这里已经足够长的时间了,您应该知道这种类型的“为我编写代码”请求对于 StackOverflow 来说完全是题外话。请查看How to Ask 并访问help center
  • 看看 F. Hauri 的解决方案!对于你所有的屈尊俯就,有一个简单的答案可以做到这一点!顺便说一句,这是一个类似但略有不同的问题,社区显然认为它可以接受:stackoverflow.com/questions/2445213/… 仅仅因为您没有针对特定查询的特定解决方案并不意味着您应该攻击那些发布它的人,如果目标是有限且明确定义。同样,如果我们要应用您的标准,那么评分为 2 或更高的脚本相关问题中可能有 50% 会消失......
  • 关于这个问题的元讨论:meta.stackoverflow.com/questions/320121/…
  • @JasonR.Mick - 这个问题是 7 年前提出的,其中规则/指​​南略有不同,但它仍然显示了 Jim Garrison 尝试/研究的内容。即使它是“微不足道的”,展示您尝试过的东西仍然是一个好主意,它有助于解释您正在寻找什么样的解决方案,并且您最终不会得到告诉您“尝试”的答案这”。如果你愿意,我邀请你在元讨论而不是这个问题上讨论这个问题
  • @Sayse 好点。如果我拒绝改进这个问题,也许他可以先提醒我,然后再关闭。我个人认为这样会更有成效。无论哪种方式,我认为我已经根据您的建议(他也暗示我认为)编辑了问题,并希望尽可能重新打开它,因为现在它更明确了

标签: bash nested directory-structure mkdir subdirectory


【解决方案1】:

试试这个:

mkdir -p hello/{i_am_a/{boy,girl,alien,dog},my_name_is/{jim,bob,secret}}

似乎完成了这项工作:

find *
hello
hello/i_am_a
hello/i_am_a/dog
hello/i_am_a/alien
hello/i_am_a/boy
hello/i_am_a/girl
hello/my_name_is
hello/my_name_is/bob
hello/my_name_is/secret
hello/my_name_is/jim

...进一步?

这将在每个目录中创建 30 个文件(命名为 file_0afile_2j):

touch hello/{i_am_a/{boy,girl,alien,dog},my_name_is/{jim,bob,secret}}/file_{0..2}{a..j}

(为了填充这 210 个文件,您可以将 touch 替换为 date | tee,作为示例。)

find * -ls | sed -ne '1,7{p;d};:;N;$!b;${s/^.*\(\(\n[^\n]*\)\{5\}\)\n*$/...\1/p;}'
1703938   4 drwxr-xr-x   4 user user  4096 avr  3 22:23 hello
1703939   4 drwxr-xr-x   6 user user  4096 avr  3 22:23 hello/i_am_a
1703943   4 drwxr-xr-x   2 user user  4096 avr  3 22:23 hello/i_am_a/dog
1704066   0 -rw-r--r--   1 user user     0 avr  3 22:23 hello/i_am_a/dog/file_2i
1704057   0 -rw-r--r--   1 user user     0 avr  3 22:23 hello/i_am_a/dog/file_1j
1704061   0 -rw-r--r--   1 user user     0 avr  3 22:23 hello/i_am_a/dog/file_2d
1704052   0 -rw-r--r--   1 user user     0 avr  3 22:23 hello/i_am_a/dog/file_1e
...
1704076   0 -rw-r--r--   1 user user     0 avr  3 22:23 hello/my_name_is/jim/file_0i
1704097   0 -rw-r--r--   1 user user     0 avr  3 22:23 hello/my_name_is/jim/file_2j
1704074   0 -rw-r--r--   1 user user     0 avr  3 22:23 hello/my_name_is/jim/file_0g
1704073   0 -rw-r--r--   1 user user     0 avr  3 22:23 hello/my_name_is/jim/file_0f
1704081   0 -rw-r--r--   1 user user     0 avr  3 22:23 hello/my_name_is/jim/file_1d

...正如Jonathan Leffler 建议的那样,看看man -Pless\ +/Brace.Expansion bash

【讨论】:

  • 嗯,这简单得令人震惊。 :) 谢谢!
  • @JasonR.Mick:参见 Bash 手册中的 Brace Expansion;它包括一个与此类似的示例。
  • 谢谢@JonathanLeffler,我想念我的RTFM推荐:man -Pless\ +/Brace.Expansion bash
猜你喜欢
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 2011-02-23
  • 2015-03-26
相关资源
最近更新 更多