我想以这样的方式创建一个目录,我需要将目录标记为 froma
到z
。在每个目录中,我需要创建子目录,以便将它们标记为等aa
。ab
因此,例如,对于目录m
,我的子目录将被标记为ma
, mb
upto mz
。
答案1
尝试:
for x in {a..z} ; do mkdir -p $x/${x}{a..z} ; done
Bash 将扩展XXX{a..z}
到XXXa
、XXXb
、 等。不需要您拥有的内循环。
在那之后:
$ 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
.