いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Bashで拡張GLOBを有効にして利用 (shopt, extglob, !(pattern), パターン以外にマッチさせる)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。結構知らない人が周りに多かったので、ついでにここにメモメモ。。。

Bashさんには、拡張GLOB (extglob) という設定があります。これをONにすると、通常のGLOB機能を拡張してくれて、追加でいろんなパターンが指定できるようになります。

有効にするには、以下のようにします。

shopt -s extglob

利用例

個人的にたまに利用するのが以下のようなときです。

例えば、どこかのディレクトリにいろいろファイルとかディレクトリが存在しているとします。

$ ls
a.txt  app.log  app_20260212.zip  app_20260213.log  b.txt  old/

ごちゃごちゃしてるので、一旦 archives ってディレクトリ作成して、そこの下に mv させて綺麗にしてしまいたい。

そういうときに、拡張GLOBさんを利用すると以下のように出来ます。

# 置き場所作る
$ mkdir archives

# 移動前。移動先となるarchivesも同じディレクトリにいる。
$ ls
a.txt  app.log  app_20260212.zip  app_20260213.log  archives/  b.txt  old/

# 拡張GLOBを使って、「archives以外はarchivesに移動」と実行
$ shopt -s extglob
$ mv !(archives) archives

# archives以外はarchvesに移動した
$ ls
archives/
$ ls archives/
a.txt  app.log  app_20260212.zip  app_20260213.log  b.txt  old/

# 拡張GLOBをオフ
$ shopt -u extglob

mv !(archives) archives

としている部分がミソで、!(archives) が拡張GLOBです。!(..) はパターンに合致するもの「以外」にマッチします。

なので、上のコマンドは「archives以外はarchivesに移動」という意味になります。

通常、こんな感じで同じディレクトリ内にアーカイブディレクトリとかを作って全ファイル移動させる場合は、アーカイブディレクトリ自身が含まれないように find コマンドなどで除外して実行したりすることが多いですが、拡張GLOB使うと楽です。

ちなみに、拡張GLOB機能は Bash 固有の機能ですので、他のシェルには同等の機能がないかもしれません。

Bashのバージョン v4 以降から利用可能なので、今の時代であればほぼ使えますね。

参考情報

www.linuxjournal.com

www.gnu.org


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。