我知道我可以通过相当冗长的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}}。
为了方便起见,让我们进一步假设三个特殊结构字符(在上面的示例中,例如n
,n=3
和{
)将永远不会出现在嵌套字符串中,即它们永远不会出现在生成的文件路径中。
似乎,
或}
嵌入式脚本可以解决这个问题,但是使用内置Perl
功能可能是一个更简单的解决方案吗?
我的目标是一个简洁的解决方案,它减少了我的数据后处理脚本的冗长程度,这通常涉及创建在更深层次上填充的分层目录树,其中保存以供重用,并在目录中完成结果走向树顶。
答案 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_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*$/...\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