LoginSignup
15
15

More than 5 years have passed since last update.

shで、 find . -name でファイル名パターンマッチを使用するときの注意事項

Posted at

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'と、パターンを含む引数をクオートで囲む。

15
15
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
15
15