一个过程将使用日期+%H 表示法将数据写入一组目录,每个小时一个目录,所以 00、01、02......22、23。我想保留个位数小时的前导 0,以保持排序列表整洁。
I=00; 直到 [ $I -gt 23 ]; 执行 mkdir $I; 让 I=I+1; 完成
不保留个位数前的 0 会产生可预见的影响。我可以直接手动进行,但我觉得应该有办法做到这一点。有什么想法吗?
答案1
mkdir $(seq -w 00 23)
答案2
mkdir {0{0..9},{10..23}}
或者在 Bash 4 中:
mkdir {00..23}
答案3
for i in `seq -w 00 23`;do mkdir $i;done
答案4
这是一个完全可移植的答案(对于几乎任何可以运行其中之一的系统上的任何 Bourne 衍生的 shell),而所有其他答案至少都有一点不可移植,要么依赖于不可移植的 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
一些说明:
最初创建目录可确保我们不会意外使用名为的环境变量的值dirs
(以防我们继承了一个环境变量)。
我们实际上可以跳过构建$dirs
变量,而只需调用mkdir $i$j
。但这种方式性能更好(启动一个 mkdir 进程而不是 24 个),并且同样易于移植(如果碰巧真的有一个系统只能接受一个目录参数*,那么这很容易适应对每个组合mkdir
进行调用而不是构建变量)。mkdir
$i$j
$dirs
到处都没有引用是有意为之,也是正确的。变量赋值和case
语句的第一部分中不需要引用替换:它们不会在这些位置进行字段拆分。在mkdir
最后的行中,我们依靠字段拆分将目录列表分成单独的名称/参数mkdir
。
* “正式的” MS-DOS 和 Windows 都有一个mkdir
仅接受一个目录名的,但至少在 Windows 7 上它可以与多个目录名一起使用,另外,据我所知,任何将 Bourne 类 shell 移植到这些系统上都带有自己的mkdir
,只有像我这样的怪人才会考虑这种级别的可移植性。