背景
bash 支持花括号扩展,举个例子,使用以下命令可以输出所有的 1 位 16 进制数。
echo 0x{0..9} 0x{A..F}
正文
Brace Expansion 一文中介绍了 bash 中的花括号扩展。
Brace Expansion 中提到了如下内容
基本形式
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 optionalpostscript.
从这部分描述中,我们知道花括号扩展有两种基本形式
[preamble]+{a,b,c}+[postscript][preamble]+{x..y[..incr]}+[postscript]
第一种形式的例子
echo {red,green,blue}.txt
第二种形式的例子
echo {2020..2026}
echo {1..9..2}
echo {a..g}
嵌套形式
Brace Expansion 中提到了如下内容
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}}
生成所有3位2进制数
echo 0b{0,1}{0,1}{0,1}
生成1~99中所有包含7的数字
暴力枚举当然没问题,用花括号扩展会比暴力枚举简单些
echo {7,{1..6}7,7{0..9},{8,9}7}
创建大量文件
# 下方的命令会尝试创建 temp 目录并在其中创建 26 * 10 = 260 个文件
mkdir temp && cd temp && touch file-{a..z}{1..10}.txt
创建大量目录
# 以下命令会尝试创建 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}