Jenkinsでちょっと凝ったことをするときにハマるのでメモ。
前提知識
特定のフォルダ以下から、foo.c
を探すときは、以下のコマンドで可能。
$ mkdir -p foo bar baz && touch {foo,bar,baz}/foo.c
$ find . -name foo.c
./baz/foo.c
./foo/foo.c
./bar/foo.c
問題の現象
特定のフォルダ以下から、*.c
にマッチするファイルを探すときは、注意が必要。
インラインで書くので見にくいかもですが、勘弁してください。
$ mkdir -p foo bar baz && touch {foo,bar,baz}/{moge,moga}.c mogogo.c
$ set -x
# 困る例
$ find -name *.c
+ find -name mogogo.c # *.cがカレントフォルダのmogogo.cに展開されちゃう
./mogogo.c
# 対策
$ find -name '*.c'
+ find -name '*.c' # 意図通り
./baz/moge.c
./baz/moga.c
./foo/moge.c
./foo/moga.c
./bar/moge.c
./bar/moga.c
./mogogo.c
$ set +x
# これが状況をわかりにくくするパターン
$ rm mogogo.c
$ ls *.c
ls: cannot access *.c: No such file or directory
# カレントフォルダに*.cにマッチするファイルがない状況では...
$ set -x
$ find -name *.c
+ find -name '*.c' # ご丁寧にクオートされて実行され、意図通りに動く。
./baz/moge.c
./baz/moga.c
./foo/moge.c
./foo/moga.c
./bar/moge.c
./bar/moga.c
$ set +x
結論
find
でパターンマッチさせたかったら、find . -name '*.c'
と、パターンを含む引数をクオートで囲む。