Ram*_*esh 12 shell-script mkdir
我想以这样一种方式创建一个目录,我需要将目录标记为从a到z。里面每个目录下,我需要创建子目录,这样它们标记为aa,ab等等。
因此,例如,对于 directory m,我的子目录将被标记为ma, mbupto mz。
Mic*_*mer 19
尝试:
for x in {a..z} ; do mkdir -p $x/${x}{a..z} ; done
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
因此,使用bash's 字母扩展的东西,这是有效的:
set {a..z}
for a do printf "./$a/$a%s\n" "$@"
done | xargs mkdir -p
Run Code Online (Sandbox Code Playgroud)
如果你只在第一行输入一次字母表,那么同样的概念应该可以移植到任何 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
Run Code Online (Sandbox Code Playgroud)
...例如在 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
Run Code Online (Sandbox Code Playgroud)
如您所见,for每个位置参数数组索引只循环一次,我在这里通过sh在调用时简单地处理参数来设置,上面使用set ${positionals}. 但是printf在每次迭代的参数列表中接收相同的数组并将其格式字符串应用于其每个参数,因此您可以获得递归的外观而没有任何不必要的递归。
并以相同的方式添加done|command将for通过管道将循环的所有输出done >file流式传输到一个文件中 - 只为整个for...done构造打开和关闭输出文件一次。