web-dev-qa-db-ja.com

"find:pathはexpressionの前に置く必要があります。"カレントディレクトリ内のファイルも検索する再帰検索を指定するにはどうすればいいですか?

現在のディレクトリとそのサブディレクトリで一致するものを探すのに苦労していますfind

find *test.cを実行すると、現在のディレクトリでの一致だけが表示されます。 (サブディレクトリには見えません)

find . -name *test.cを試しても同じ結果が期待できますが、その代わりにサブディレクトリにあるものだけが得られます。作業ディレクトリに一致するはずのファイルがある場合は、それが表示されます。find: paths must precede expression: mytest.c

このエラーとはどういう意味ですか、また現在のディレクトリとそのサブディレクトリの両方から一致を取得する方法を教えてください。

213
Chris Finley

引用符で囲んでみてください - あなたはシェルのワイルドカード拡張に遭遇しています、それであなたが実際に見つけるために渡しているものは以下のようになるでしょう:

find . -name bobtest.c cattest.c snowtest.c

...構文エラーが発生しました。だから代わりにこれを試してみてください:

find . -name '*test.c'

ファイル表現を囲む一重引用符に注意してください。これはシェル(bash)がワイルドカードを拡張するのを防ぎます。

360
Chris J

何が起こっているのかというと、シェルは "* test.c"をファイルのリストに展開しています。次のようにアスタリスクをエスケープしてみてください。

find . -name \*test.c
25
Jim Garrison

引用符で囲んでみてください。

find . -name '*test.c'
14
rkulla

マニュアルから探す:

NON-BUGS         

   Operator precedence surprises
   The command find . -name afile -o -name bfile -print will never print
   afile because this is actually equivalent to find . -name afile -o \(
   -name bfile -a -print \).  Remember that the precedence of -a is
   higher than that of -o and when there is no operator specified
   between tests, -a is assumed.

   “paths must precede expression” error message
   $ find . -name *.c -print
   find: paths must precede expression
   Usage: find [-H] [-L] [-P] [-Olevel] [-D ... [path...] [expression]

   This happens because *.c has been expanded by the Shell resulting in
   find actually receiving a command line like this:
   find . -name frcode.c locate.c Word_io.c -print
   That command is of course not going to work.  Instead of doing things
   this way, you should enclose the pattern in quotes or escape the
   wildcard:
   $ find . -name '*.c' -print
   $ find . -name \*.c -print
9

@Chris Jの答えで説明されているように、正規表現にまとめることができない複数のファイル名を見つけようとしたときに、この質問に出会いました。

find . -name one.pdf -o -name two.txt -o -name anotherone.jpg

-oまたは-orは論理和です。詳しくは Gnu.orgでファイルを探す を参照してください。

私はCygWinでこれを実行していました。

0
HappyTown

私の場合、パスの末尾に/がありません。

find /var/opt/gitlab/backups/ -name *.tar
0
Vikash Singh