Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

または、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
catfist
物書き志望です。
https://wbtmiu.herokuapp.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away