LoginSignup
20
19

More than 5 years have passed since last update.

findコマンドで無視リストを利用する

Posted at

動機

  • findで.DS_Storeが引っかかるのウザすぎ!!!
  • 無視リストをどっかから引っ張ってきたい
  • ~/.gitignoreでよくね?

方法

下記記事がそのものズバリだった。

# .DS_Storeや*.swpが出力される
$ find . -maxdepth 1 -mindepth 1 -type f
./.blanc.scpt.swp
./.DS_Store
./hoge.txt

$ cat ~/.gitignore
.gitignore
.DS_Store
*.swp
*.bak
.watsonrc

# 展開後のコマンド: 
# find . -maxdepth 1 -mindepth 1 ! -name .gitignore ! -name .DS_Store ! -name *.swp ! -name *.bak ! -name .watsonrc 
$ find . -maxdepth 1 -mindepth 1 $(printf "! -name %s " $(cat ~/.gitignore))
./hoge.txt

ここで、気を利かせて$(~)をダブルクォートで囲ってはいけない。findコマンドはダブルクォートされた文字列をオプションとして解釈しないので、エラーになる。

実はけっこう長いことハマってた。

$ find . -maxdepth 1 -mindepth 1 "$(printf "! -name %s " $(cat ~/.gitignore))"
find: ! -name .gitignore ! -name .DS_Store ! -name *.swp ! -name *.bak ! -name .watsonrc : unknown primary or operator

シェルスクリプト化

  • 無視リストを利用する以外、通常のfindコマンドと同様にする。
  • スクリプトの引数を全部findのオプションとしてブチ込む。
findi.sh
#!/bin/bash
# alias find=findi
find $* $(printf "! -name %s " $(cat ~/.gitignore))
20
19
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
20
19