[bash] 借助花括号扩展来批量生成内容

9 阅读2分钟

背景

bash 支持花括号扩展,举个例子,使用以下命令可以输出所有的 116 进制数。

echo 0x{0..9} 0x{A..F}

image.png

正文

Brace Expansion 一文中介绍了 bash 中的花括号扩展。

Brace Expansion 中提到了如下内容

基本形式

image.png

Patterns to be brace expanded take the form of an optional preamble, followed by either a series of comma-separated strings or a sequence expression between a pair of braces, followed by an optional postscript.

从这部分描述中,我们知道花括号扩展有两种基本形式

  • [preamble] + {a,b,c} + [postscript]
  • [preamble] + {x..y[..incr]} + [postscript]

第一种形式的例子

echo {red,green,blue}.txt
image.png

第二种形式的例子

echo {2020..2026}
echo {1..9..2}
echo {a..g}
image.png

嵌套形式

Brace Expansion 中提到了如下内容

image.png

Brace expansions may be nested. The results of each expanded string are not sorted; left to right order is preserved.

例子

生成所有1位16进制数

在文章开头,我们已经举了这个例子,现在换一种写法

echo 0x{{0..9},{A..F}}
image.png
生成所有3位2进制数
echo 0b{0,1}{0,1}{0,1}

image.png

生成1~99中所有包含7的数字

暴力枚举当然没问题,用花括号扩展会比暴力枚举简单些

echo {7,{1..6}7,7{0..9},{8,9}7}
image.png
创建大量文件
# 下方的命令会尝试创建 temp 目录并在其中创建 26 * 10 = 260 个文件
mkdir temp && cd temp && touch file-{a..z}{1..10}.txt

image.png

创建大量目录
# 以下命令会尝试创建 2020,2021,2022,2023,2024,2025,2026 这些目录,
# 并且会尝试在这些目录下创建 01,02,03,04,05,06,07,08,09,10,11,12 子目录
mkdir -p {2020..2026}/{01..12}
image.png

参考资料