从紧凑的字符串表示创建分层目录树

Creating Hierarchical Directory Tree From Compact String Representation

我知道我可以通过一系列相当冗长的 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

我想在一次调用中使用由列表开始字符(即 {)、列表定界符(即 ,)., 和列表结束字符(即 }).

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

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

'hello{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 功能的更简单的解决方案?

我的目标是一个简洁的解决方案,减少我的数据 post 处理脚本的冗长,这通常涉及创建分层目录树,这些目录树在更深的层次上填充,我保存这些中间体以供重用和在树顶部的目录中完成结果。

试试这个:

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*$/.../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