使用 mkdir 创建多个目录

And*_*rew 16 shell directory

我想使用mkdir. 每个目录名称将由前缀(字符串)和索引(整数)组成。假设我希望前缀为“s”,索引范围为 1 到 50。这意味着我想创建标题为:

s1, s2, ... , s49,s50

有没有办法使用自动执行此操作mkdir?谢谢你的时间。

Jho*_*han 38

  • 你可能想用 `$i` 做更多的事情,而不仅仅是创建一个目录,例如 `mkdir s$i ;回声 $i > s$i/$i`。此外,One 是在 bash 中使用 for 循环的一个很好的简单示例......在这样的网站上,新手用户根本不可能看到它并认为“很好,我没有意识到你可以这样做" ---> 启蒙。 (7认同)
  • 你为什么要使用一加二? (4认同)
  • @Kevin 虽然五十个不太可能是问题,但如果你有五百个目录,你可能会担心参数限制。 (4认同)
  • @rahmu:我认为人们应该只考虑 jhonathan 的回答是否解决了 OP 的 shell (bash) 的问题,而不必考虑其他人的问题。 (3认同)

Ran*_*832 33

您可以使用 shell 脚本执行此操作。

纯 sh - 这甚至适用于 POSIX 之前的 bourne shell:

n=1;
max=50;
while [ "$n" -le "$max" ]; do
  mkdir "s$n"
  n=`expr "$n" + 1`;
done
Run Code Online (Sandbox Code Playgroud)

如果您想创建大量目录,您可以通过将脚本减少到单个调用mkdir以及使用 shell 内置函数进行测试和算术来加快脚本速度。像这样:

n=1
max=50
set -- # this sets $@ [the argv array] to an empty list.

while [ "$n" -le "$max" ]; do
    set -- "$@" "s$n" # this adds s$n to the end of $@
    n=$(( $n + 1 ));
done 

mkdir "$@"
Run Code Online (Sandbox Code Playgroud)

Zsh、ksh93 或 bash 使这更容易,但我应该指出这不是内置的mkdir,可能无法在其他 shell 中工作。对于较大的情况,它也可能受到可传递给命令的参数数量或总大小的限制的影响。

mkdir s{1..50}
Run Code Online (Sandbox Code Playgroud)

  • +1 这太棒了!不过,我必须挑剔一件事:`n=$(( n + 1 ))` 会严格地遵循 POSIX,并且不会花费你一个子shell。 (3认同)

lae*_*ade 11

这里有很多复杂的答案,但 bash 让它变得非常简单。当然,纯 POSIX 解决方案有效,但为什么不利用bash您正在使用的外壳呢?您可以通过大括号扩展轻松完成此操作:

% mkdir -v s{1..10} && ls -1d s{1..10}                                   (09-24 17:37)
mkdir: created directory `s1'
mkdir: created directory `s2'
mkdir: created directory `s3'
mkdir: created directory `s4'
mkdir: created directory `s5'
mkdir: created directory `s6'
mkdir: created directory `s7'
mkdir: created directory `s8'
mkdir: created directory `s9'
mkdir: created directory `s10'
s1
s10
s2
s3
s4
s5
s6
s7
s8
s9
Run Code Online (Sandbox Code Playgroud)


cas*_*cas 7

mkdir $(seq --format 's%.0f' 1 50)

或者如果你想要零填充数字(这对排序会更好):

mkdir $(seq --format 's%02.0f' 1 50)

或者:

mkdir s$(seq -s ' s' -w 1 50)-- 注意 's' 之前的字符串$(),如果没有它,创建的第一个目录将只是 '01' 而不是 's01'

最后: mkdir $(printf "s%02i " $(seq 1 50))

seq 来自 GNU Coreutils

奇怪的是, seq--format-foption 只允许 printf 的浮点双精度类型(如 f 和 g。也是一种奇怪的浮点十六进制格式,我从未发现有任何用处)。我不知道为什么。如果它还支持其他printf(3)数字类型,如整数 (d,i)、八进制 (o,U) 或十六进制 (x,X) ,那就太好了。

无论如何,为此目的,具有 0 十进制精度的双精度格式(例如%.0f%02.0f足够接近整数)。

$ seq --help
用法:seq [OPTION]... LAST
  或:seq [OPTION]... FIRST LAST
  或: seq [OPTION]... 第一个增量最后一个
以 INCREMENT 为单位,从 FIRST 到 LAST 打印数字。

  -f, --format=FORMAT 使用 printf 风格的浮点格式
  -s, --separator=STRING 使用 STRING 来分隔数字(默认:\n)
  -w, --equal-width 通过填充前导零来均衡宽度
      --help 显示此帮助并退出
      --version 输出版本信息并退出

如果省略 FIRST 或 INCREMENT,则默认为 1。即
即使 LAST 小于 FIRST,省略 INCREMENT 默认为 1。
FIRST、INCREMENT 和 LAST 被解释为浮点值。
如果 FIRST 小于 LAST,则 INCREMENT 通常为正,并且
如果 FIRST 大于 LAST,则 INCREMENT 通常为负。
FORMAT 必须适合打印一个“double”类型的参数;
如果 FIRST、INCREMENT 和 LAST 都是定点,则默认为 %.PRECf
具有最大精度 PREC 的十进制数,否则为 %g。

另见:http : //www.gnu.org/software/coreutils/manual/html_node/seq-invocation.html