動機
- 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))