Bash 1 liner:如何为每个小时(00 到 23)创建一个目录?

Bash 1 liner:如何为每个小时(00 到 23)创建一个目录?

一个过程将使用日期+%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,只有像我这样的怪人才会考虑这种级别的可移植性。

相关内容