递归地为所有字母创建目录

递归地为所有字母创建目录

我想以这样的方式创建一个目录,我需要将目录标记为 fromaz。在每个目录中,我需要创建子目录,以便将它们标记为等aaab

因此,例如,对于目录m,我的子目录将被标记为ma, mbupto mz

答案1

尝试:

for x in {a..z} ; do mkdir -p $x/${x}{a..z} ; done

Bash 将扩展XXX{a..z}XXXaXXXb、 等。不需要您拥有的内循环。

在那之后:

$ ls
a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z
$ ls m
ma  mc  me  mg  mi  mk  mm  mo  mq  ms  mu  mw  my
mb  md  mf  mh  mj  ml  mn  mp  mr  mt  mv  mx  mz

答案2

所以,通过bash的字母扩展,这是有效的:

set {a..z}
for a do printf "./$a/$a%s\n" "$@"
done | xargs mkdir -p

如果您只在第一行输入一次字母表,那么相同的概念应该可以移植到任何 shell。如果您不想键入它,还有其他方法可以到达设置的行,例如:

seq -sP32P 97 123|dc
a b c d e f g h i j k l m n o p q r s t u v w x y z 

...例如在 ASCII 语言环境中工作。因此,您可以使用set $(seq -sP32P 97 123|dc)或任何其他命令来获取$IFS所需参数的单独列表,但是,我的意思是,最好只是使用该bash东西或键入它。

不管怎样,我认为这就是我会这样做的方式,因为它只在mkdir必要时调用。

只是为了证明如何它有效,这是较小集合的一些调试输出:

sh -cx 'for n do printf "./$n/$n%s\n" "$@"; done|cat' -- arg1 arg2 arg3
+ for n in '"$@"'
+ printf './arg1/arg1%s\n' arg1 arg2 arg3
+ cat
+ for n in '"$@"'
+ printf './arg2/arg2%s\n' arg1 arg2 arg3
+ for n in '"$@"'
+ printf './arg3/arg3%s\n' arg1 arg2 arg3
./arg1/arg1arg1
./arg1/arg1arg2
./arg1/arg1arg3
./arg2/arg2arg1
./arg2/arg2arg2
./arg2/arg2arg3
./arg3/arg3arg1
./arg3/arg3arg2
./arg3/arg3arg3

正如您所看到的,for每个位置参数数组索引唯一循环一次,我在这里通过简单地sh在调用时传递参数来设置它,上面用set ${positionals}.但printf每次迭代都会在其参数列表中接收相同的数组,并将其格式字符串应用于每个参数,因此您可以获得递归的外观,而无需任何不必要的递归。

并且以相同的方式将循环的done|command所有for输出流式传输到管道上,done >file会将其全部流式传输到文件中 - 整个for...done构造只打开和关闭输出文件一次。

答案3

这里,我最终创建了一个这样的脚本。但是,如果我得到一个优雅的解决方案,我会接受它作为答案。

for x in {a..z}
do
    mkdir -p /home/ramesh/$x
    cd /home/ramesh/$x
    for y in {a..z}
    do
        mkdir -p /home/ramesh/$x/$x$y
    done
done

答案4

Perl

perl -MFile::Path=make_path -e '
    make_path(map { $l=$_; map { "$l/$l$_" } a..z } a..z)
'

File::Path是核心模块,因为Perl 5.001.

相关内容