現在のディレクトリとそのサブディレクトリで一致するものを探すのに苦労していますfind。
find *test.c
を実行すると、現在のディレクトリでの一致だけが表示されます。 (サブディレクトリには見えません)
find . -name *test.c
を試しても同じ結果が期待できますが、その代わりにサブディレクトリにあるものだけが得られます。作業ディレクトリに一致するはずのファイルがある場合は、それが表示されます。find: paths must precede expression: mytest.c
このエラーとはどういう意味ですか、また現在のディレクトリとそのサブディレクトリの両方から一致を取得する方法を教えてください。
引用符で囲んでみてください - あなたはシェルのワイルドカード拡張に遭遇しています、それであなたが実際に見つけるために渡しているものは以下のようになるでしょう:
find . -name bobtest.c cattest.c snowtest.c
...構文エラーが発生しました。だから代わりにこれを試してみてください:
find . -name '*test.c'
ファイル表現を囲む一重引用符に注意してください。これはシェル(bash)がワイルドカードを拡張するのを防ぎます。
何が起こっているのかというと、シェルは "* test.c"をファイルのリストに展開しています。次のようにアスタリスクをエスケープしてみてください。
find . -name \*test.c
引用符で囲んでみてください。
find . -name '*test.c'
マニュアルから探す:
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
@Chris Jの答えで説明されているように、正規表現にまとめることができない複数のファイル名を見つけようとしたときに、この質問に出会いました。
find . -name one.pdf -o -name two.txt -o -name anotherone.jpg
-o
または-or
は論理和です。詳しくは Gnu.orgでファイルを探す を参照してください。
私はCygWinでこれを実行していました。
私の場合、パスの末尾に/
がありません。
find /var/opt/gitlab/backups/ -name *.tar