グロブとブレース展開

グロブ

ワイルドカードや文字クラスを使用してファイル名展開を行う。

* 任意の0文字以上の文字列
? 任意の1文字の文字
[] [ ] に含まれる文字列

先頭がaから始まるファイル

1$ ls a*

ファイル名の末尾がaとなるファイル

1$ ls *a

先頭が任意の文字でその後bcとなるファイル

1$ ls ?bc*

先頭がaかbかcで始まるファイル

1$ ls [a-c]*

先頭がa b c以外で始まるファイル

1$ ls [!a-c]*
2$ ls [^a-c]*

ファイル名の先頭一文字が数字のファイル

1$ ls [0-9]*
2$ ls [[:digit:]]*

ディレクトリ内を再帰的に検索する

カレントディレクトリ以下のディレクトリを再帰的に検索しマッチさせるためには、**を使用する。
シェルオプションの設定が必要

1$ shopt -s globstar

設定が無効のとき
ls *.mdカレントディレクトリの.mdが展開される。
ls **/*.mdカレントディレクトリの1階層下のサブディレクトリに存在する.mdが展開される。
**/がカレントディレクトリのサブディレクトリにマッチしている。

設定が有効のとき
ls **/*.mdにするとカレントディレクトリ以下全てのディレクトリに存在する.mdが展開される。 **/が0個以上のディレクトリにマッチする。

カレントディレクトリ以下全てのディレクトリ、ファイルを表示

1$ ls **

拡張グロブ

パターンマッチングさせる場合に利用。
シェルオプションの設定が必要

1$ shopt -s extglob

!(foo) foo の否定
?(foo) foo が0回もしくは1回
*(foo) foo が0回以上
+(foo) foo が1回以上
@(foo) foo がいずれか1回
foo は|で区切って記述する

abc.txt と def.txt 以外のファイルを表示する

1$ ls !(abc|def).txt

abc.txt bbc.txt bc.txt を表示する

1$ ls *([ab])bc.txt
2$ ls ?([ab])bc.txt
3$ ls @(abc|bbc|bc).txt

ブレース展開

カッコの読み方が
() parentheses
[] square brackets
{} braces
らしく{}を利用した展開がブレース展開。{}内を展開する。

$ echo a{1,2,3}
a1 a2 a3
$ echo {a,b,c}{1,2,3}
a1 a2 a3 b1 b2 b3 c1 c2 c3

始点と終点を..で区切ると連続して展開

$ echo {a..c}{1..3}
a1 a2 a3 b1 b2 b3 c1 c2 c3

増分を指定することも可能

//a1からa20まで増分は3
$ echo a{1..20..3}
a1 a4 a7 a10 a13 a16 a19

ゼロ埋めも可能

$ echo a{01..20..3}
a01 a04 a07 a10 a13 a16 a19