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

Jas*_*ick 6 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

'你好{{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
Run Code Online (Sandbox Code Playgroud)

为方便起见,假设如果它影响解的长度,我们可以假设n在结果树中只有嵌套层(例如,n=3在上面的例子中).

让我们进一步假设为方便起见,这三个特殊的结构特点(在上面的例子中,例如{,,})嵌套字符串将永远不会发生,也就是说,它们将永远不会得到的文件路径显示出来.

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

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

F. *_*uri 19

试试这个:

mkdir -p hello/{i_am_a/{boy,girl,alien,dog},my_name_is/{jim,bob,secret}}
Run Code Online (Sandbox Code Playgroud)

似乎做了这个工作:

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
Run Code Online (Sandbox Code Playgroud)

... 进一步?

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

touch hello/{i_am_a/{boy,girl,alien,dog},my_name_is/{jim,bob,secret}}/file_{0..2}{a..j}
Run Code Online (Sandbox Code Playgroud)

(用于填充这210个文件,你可以更换touchdate | 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
Run Code Online (Sandbox Code Playgroud)

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

  • @JasonR.Mick:参见Bash手册中的[Brace Expansion](https://www.gnu.org/software/bash/manual/bash.html#Brace-Expansion); 它包括一个与此类似的例子. (3认同)