zsh に限らずたいていのシェルでは、ファイル名としてパターンを指定してマッチさせることができる。例えば rm *.bak
とすると .bak で終わる名前のファイル全部を削除できる。
でも zsh はもっと強力で、「まとめてファイルを削除したいけど、このファイルだけは残したい」 というような除外パターンも指定できるので紹介する。
まず準備として、.zshrc で下のオプションを有効にしておこう。
setopt extended_glob
これで ^
と ~
を使って除外パターンを指定できるようになる。
^
と ~
の使い方は以下。
マッチを反転させる
^
を使うとマッチの反転ができる。
例えば ^Makefile
で「Makefile 以外のファイル全部」、^*.bak
で「ファイル名の末尾が .bak でないファイル全部」という意味になる。
マッチを引き算する
「パターン1~パターン2」という形で ~
を使うと、パターン1にマッチしてパターン2にマッチしないもの全部という意味になる。パターン1からパターン2を引き算しているようなイメージ。
例えば *~OLD
で「OLD 以外のすべてのファイル」、*.c~temp_*
で「ファイル名の末尾が .c かつファイル名の先頭が temp_ でないファイル全部」という意味になる。
どんな時に使うと便利かという例を紹介する。
例1
ファイル全部を1つのディレクトリに移動させたいようなときに使える。
% cd Desktop
% ls
hoge.c fuga.c piyo.h
dir1/ dir2/ dir3/
...
# なんかデスクトップにいっぱいファイルとかフォルダがある。
# 一旦ディレクトリを作って全部そこに入れたい。
% mkdir OLD
% mv ^OLD OLD
# 「OLD以外の全ファイルをOLDに移動」という意味になるのでうまくいく。
例2
大事なファイルといらないファイルが1つのディレクトリ内にまざってしまったときにも役に立つ。
% cd ~
% ls
Desktop/ bin/
img.jpg img.jpg img.jpg
gomi4.png gomi5.png gomi6.png
...
# おおお、ホームディレクトリに変な画像をぶちまけてしまった!
# いらないのを削除したい。でも Desktop と bin は大事なので残したい。
# zsh なら大丈夫。
% rm *~Desktop~bin
# これで「Desktop と bin を残して、それ以外を全部削除する」という意味になる。
# こんなふうに ~ は何個も連結して引き算できる。
例3
「今回はこのファイルだけは含めたくない」というようなときにも使える。
% ls
file1.rb file2.rb file3.rb file4.rb
% vim ... # 何か編集 ...
# 勢いでばんばん修正したけど、そろそろ git にコミットしたい。
# でも file3.rb だけは今回コミットしたくない。
% git add ^file3.rb
# git add file1.rb file2.rb file4.rb になる。
% git commit
# file3.rb 以外だけコミットできた!
工夫次第でいろいろ役に立つと思うので参考にしてください!
参考
zshexpn(1) の FILENAME GENERATION