LoginSignup
14
12

More than 5 years have passed since last update.

zsh のファイル名生成で除外パターンを指定する

Posted at

zsh に限らずたいていのシェルでは、ファイル名としてパターンを指定してマッチさせることができる。例えば rm *.bak とすると .bak で終わる名前のファイル全部を削除できる。

でも zsh はもっと強力で、「まとめてファイルを削除したいけど、このファイルだけは残したい」 というような除外パターンも指定できるので紹介する。

まず準備として、.zshrc で下のオプションを有効にしておこう。

.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

14
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12