从紧凑的字符串表示创建分层目录树
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
,因为实例)。
为方便起见,我们进一步假设三个特殊结构字符(在上面的示例中,例如{
、,
和}
)永远不会出现在嵌套中字符串,即它们永远不会出现在生成的文件路径中。
Perl
或 Python
嵌入式脚本似乎可以解决问题,但也许有使用内置 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_0a
到 file_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
我知道我可以通过一系列相当冗长的 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
,因为实例)。
为方便起见,我们进一步假设三个特殊结构字符(在上面的示例中,例如{
、,
和}
)永远不会出现在嵌套中字符串,即它们永远不会出现在生成的文件路径中。
Perl
或 Python
嵌入式脚本似乎可以解决问题,但也许有使用内置 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_0a
到 file_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