【bash】シェルにおけるパス名展開「[ ]」

前回はワイルドカード編。
今回はちょっぴりテクニカルなパス名展開「[ ]」を確認します。

一番はじめに

同名ファイルの大文字小文字の区別ができないという現象にぶち当たったので、その記事を先に貼っておきます。

dandy-tech.hatenablog.jp


軽く調べた感じだと、MacWindowsでは大文字小文字の区別の問題があるみたいです。

はじめに(本題)

今回、以下のような要素が詰まったディレクトリがあるとします。

$ 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

おわりに

パス名展開についてはこれでおしまいです。

しかし、展開にはほかにも種類があるのでまた記事でまとめるかもしれません。