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

时间:2016-03-31 06:07:51

标签: bash nested directory-structure mkdir subdirectory

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

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

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

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

  

' {你好{i_am_a男孩,女孩,外星人,狗},{my_name_is吉姆,鲍勃,秘密}}'

......应该创建以下内容......

}

为方便起见,我们假设如果它影响解决方案的长度,我们可以假设结果树中的嵌套层数不超过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 层(例如{例如,在上面的示例中,{1}}。

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

似乎,}嵌入式脚本可以解决这个问题,但是使用内置Perl功能可能是一个更简单的解决方案吗?

我的目标是一个简洁的解决方案,它减少了我的数据后处理脚本的冗长程度,这通常涉及创建在更深层次上填充的分层目录树,其中保存以供重用,并在目录中完成结果走向树顶。

1 个答案:

答案 0 :(得分:19)

试试这个:

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