LoginSignup
63
63

More than 5 years have passed since last update.

findコマンドで複雑な検索条件を設定する

Last updated at Posted at 2015-02-05

または、Vimの設定ファイルを検索して編集する自作コマンドevimについて。

必要な検索条件

探したいのは以下のファイル。これらの中には実体ファイルとシンボリックリンクがともに含まれる。

  • ~
    • .vimrc
    • hateblo.vim
  • $vim_conf(=~/.vim/conf)
    • bundle-init.vim
    • (以下略)

つまり、検索条件をテキストで表現するなら以下の通り。

  • 「~」または「$vim_conf」ディレクトリに存在する
  • ファイル名が「.vimrc」または「*.vim」
  • タイプが「ファイル」または「シンボリックリンク」

各種のオプション

ディレクトリ指定

複数のディレクトリを検索するには、単に並べれば良い。
さらに、親ディレクトリとサブディレクトリを除くため、depth指定をする。

# export vim_conf=~/.vim/conf
find ~ "$vim_conf" -mindepth 1 -maxdepth 1

タイプ指定

-o(-or)オプションを利用する。

find . -type f -o -type l

ファイル名指定

タイプと同様に指定する。

find . -name '.vimrc' -o -name '\*.vim'

なお、ここで特定のファイル名を除外する場合、-notオプションを併用する。

find . \( -name '.vimrc' -o -name '\*.vim' \) -not -name '\*bundle\*'

複数のオプションを任意に適用する

上の例に使用したが、複数のオプションを適切に扱うには、\(\)で括る。

括弧内の条件が先に計算されるため、上記の例は「ファイル名が.vimrcまたは.vim」の候補から「ファイル名が*bundleでない」ものを絞り込むという意味になる。

言い換えれば、\( -name '.vimrc' -o -name '\*.vim' \)-not -name '*bundle*'のそれぞれに、暗黙的に-a(-and)が適用されている。

まとめる

$ find ~ "$vim_conf" \( -type f -o -type l \) \( -name '*.vim' -o -name '.vimrc' \) -not -name '*bundle*' -mindepth 1 -maxdepth 1
/Users/catfist/.hateblo.vim
/Users/catfist/.vimrc
# 以下略

シェルスクリプト化する

これを、grepecoに渡して絞り込み、さらにMacVimに渡す。

evim.sh
#!/bin/bash
find ~ "$vim_conf" \( -type f -o -type l \) \( -name '*.vim' -o -name '.vimrc' \) -not -name '*bundle*' -mindepth 1 -maxdepth 1 | grepeco "$*" | xargs mvim
63
63
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
63
63