【bash】シェルにおけるパス名展開「[ ]」
前回はワイルドカード編。
今回はちょっぴりテクニカルなパス名展開「[ ]」を確認します。
一番はじめに
同名ファイルの大文字小文字の区別ができないという現象にぶち当たったので、その記事を先に貼っておきます。
はじめに(本題)
今回、以下のような要素が詰まったディレクトリがあるとします。
$ ls -aR .: . 002.dat 112.dat aaA.dat aaC.dat dir2 .. 003.dat 113.dat aab.dat aad.dat 000.dat 004.dat 114.dat aaB.dat aaD.dat 001.dat 111.dat aaa.dat aac.dat dir1 ./dir1: . .. ./dir2: . ..
dir1とdir2は空のディレクトリです。
「[ ]」
「[ ]」は[ ]の中の条件に従う1文字に対応したものを展開します。
実際に確認します。
$ ls -aR .: . 002.dat 111.dat 114.dat aac.dat dir2 .. 003.dat 112.dat aaa.dat aad.dat 001.dat 004.dat 113.dat aab.dat dir1 ./dir1: . .. ./dir2: . .. $ ls 00[123].dat 001.dat 002.dat 003.dat $ ls 00[1-3].dat 001.dat 002.dat 003.dat $ ls aa[abc].dat aaa.dat aab.dat aac.dat $ ls aa[a-c].dat aaa.dat aab.dat aac.dat
$ ls -aR
最初はディレクトリ内のものをすべてリストしました。
$ ls 00[123]
$ ls 00[1-3]
これらは同じ出力を返します。
[ ]中に個別に文字を指定することもできます。
また、"-"を使うことで範囲を指定しています。
$ ls aa[abc]
$ ls aa[a-c]
先ほどと同様で、英字に対しても利用できます。
こちらはアルファベット順になります。
今度は条件を持たせてみます
$ ls 00[1-3].dat 001.dat 002.dat 003.dat $ ls 00[!1-3].dat 004.dat
$ ls 00[!1-3].dat
[]の中に「!」をつけると、NOTとなります。
すなわち、[!1-3]は[1-3]の補集合、つまり[4]です。
最後は文字クラスを用いてみます。
[:alnum:] # alphabet+number [a-zA-Z0-9]と同義 [:alpha:] # alphabet [a-zA-Z]と同義 [:digit:] # [0-9]と同義 [:lower:] # 小文字英字[a-z]と同義 [:upper:] # 大文字英字[A-Z]と同義 [:punct:] # [記号]と同義 [:blank:] # space, tabに相当
実際に使ってみます。
$ ls -aR .: . 002.dat 111.dat 114.dat aaA.dat aac.dat aa_.dat aaD.dat .. 003.dat 112.dat aa aab.dat aaC.dat aa-.dat dir1 001.dat 004.dat 113.dat aaa.dat aaB.dat aa=.dat aad.dat dir2 ./dir1: . .. ./dir2: . .. $ ls aa[[:alpha:]].dat aaa.dat aaA.dat aab.dat aaB.dat aac.dat aaC.dat aad.dat aaD.dat $ ls aa[[:lower:]].dat aaa.dat aab.dat aac.dat aad.dat ls aa[[:upper:]].dat aaA.dat aaB.dat aaC.dat aaD.dat $ ls aa[[:punct:]].dat aa=.dat aa_.dat aa-.dat $ ls aa[![:punct:]].dat aaa.dat aaA.dat aab.dat aaB.dat aac.dat aaC.dat aad.dat aaD.dat
おわりに
パス名展開についてはこれでおしまいです。
しかし、展開にはほかにも種類があるのでまた記事でまとめるかもしれません。