「find:パスは式の前に置く必要があります:」現在のディレクトリでファイルも検索する再帰検索を指定するにはどうすればよいですか?


235

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

実行するfind *test.cと、現在のディレクトリでの一致のみが表示されます。(サブディレクトリを検索しません)

私が試した場合find . -name *test.c、同じ結果が期待されますが、代わりに、サブディレクトリにある一致のみが表示されます。作業ディレクトリに一致する必要があるファイルがある場合、それは私に与えます:find: paths must precede expression: mytest.c

このエラーの意味と、現在のディレクトリとそのサブディレクトリの両方から一致を取得するにはどうすればよいですか?


4
レコードについては、パターンを引用符で囲まないとfindmsysgitがこのエラーをスローする場合がありますfind . -name "*test.c"。(Windowsよりも優先してfind.execmdから使用することを選択した場合)
n611x007

回答:


393

引用符で囲んでみてください-シェルのワイルドカード展開に遭遇しているので、検索に渡すものは次のようになります。

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

...構文エラーの原因です。代わりにこれを試してください:

find . -name '*test.c'

ファイル式を囲む一重引用符に注意してください。これらは、シェル(bash)によるワイルドカードの展開を停止します。


15
例として、実行すると何が起こっているかを確認できますecho *test.c。その結果、ワイルドカードがエコー拡張されず、シェル自体がエコーされます。簡単なレッスンは、ワイルドカードを使用している場合は、ファイル指定を引用します:-)
Chris J

このVARIANTを手伝ってくれてありがとう。find . -type f -printf ‘%TY-%Tm-%Td %TT %p\n’ウェブで見つけたように試してみたところ、「パスは表現に先行しなければならない」と遭遇しました。問題は、引用符が「スマート」すぎることでした。コマンドを再入力すると、引用符が置き換えられ、実行されました。
スマンドリ2013年

2
どういうわけか、一重引用符が機能しませんでした。二重引用符を使わなければなりませんでした。¯\ _(ツ)_ /¯
Planky

ワイルドカード検索の単一引用符はBusyboxとGNUで機能しましたfind-ワイルドカード*.$variableを使用する場合は二重引用符が必要です。
スチュアートカルドール2017年

@Planky:シェルスクリプトファイルに:find、-name 'write.lock'と入力しましたが、このエラーメッセージが含まれています。しかし、私がコンソールに入力すると、それは機能します。誰もが理由を知っていますか?
Scott Chu

28

シェルが「* test.c」をファイルのリストに展開しているのです。次のようにアスタリスクをエスケープしてみてください:

find . -name \*test.c

#gitbashこれは、パターンを引用している場合でも、Windowsでgit bashを使用する場合の解決策でしたfind . -name '*txt'
別のベン


13

検索マニュアルから:

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

0

@Chris Jの回答に記載されているように、正規表現に結合できない複数のファイル名を見つけようとしたときに、この質問に出くわしました。

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

-oor -orは論理ORです。詳細については、Gnu.orgでのファイルの検索を参照してください。

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.