Bash 1class轮:如何制作每个小时00到23的目录?

一个进程将写入一组目录,每一个小时使用date+%H表示法,所以00,01,02 … 22,23。我想保持个位数小时的前导0sorting清单整齐。

I = 00; 直到[$ I -gt 23]; 做mkdir $我; 让我= I + 1; DONE

有可预见的影响,不保持领先的0之前的个位数。 我可以去手工制作,但觉得应该有办法做到这一点。 有任何想法吗?

mkdir $(seq -w 00 23) 
 mkdir {0{0..9},{10..23}} 

或在Bash 4:

  mkdir {00..23} 
 for i in `seq -w 00 23`;do mkdir $i;done 

这是一个完全可移植的答案(对任何可以运行其中一个系统的Bourne衍生shell),而所有其他答案至less有一点不可移植性,要么依赖于非可移植的shell结构或seq ,这是常见的,但POSIX和通用都不是:

 # start with a blank/clean "dirs" variable dirs= # iterate over the first digit for i in 0 1 2 do # ..and the second digit for each first digit for j in 0 1 2 3 4 5 6 7 8 9 do # add each digit combination to the dirs list dirs=$dirs\ $i$j # ..until we reach 23 - then we're done. case $i$j in 23) break 2; esac done done # finally make the directories mkdir $dirs 

一些说明:

创builddirs最初确保我们不会意外地使用名为dirs的环境variables的值,以防我们inheritance它。

我们实际上可以跳过构build$dirsvariables,只需调用mkdir $i$j 。 但是这种方式performance更好(一个mkdir进程启动而不是24个),并且就像可移植的(如果有一个机会真的有一个系统,那么mkdir只能有一个目录参数*,这很容易适应每个调用mkdir $i$j组合而不是构build$dirsvariables)。

四处引用的缺失既是故意的,也是正确的。 替代品不需要在variables分配和case陈述的第一部分中引用:它们不会在这些地方进行字段拆分。 而在最后的mkdir行中,我们依靠字段拆分将目录列表分隔为mkdir单独名称/参数。

*“官方”MS-DOS和Windows有一个mkdir ,只有一个目录名,但至less在Windows 7上它可以与多个目录名一起工作,再加上任何类似Bourne的shell的端口到我所知道的那些系统它是自己的mkdir ,只有像我这样的怪人才会考虑这种可移植性。