현재 디렉토리와 하위 디렉토리에서 일치하는 항목을 찾는 데 어려움을 겪고 있습니다.
내가 실행할 때 find *test.c
현재 디렉토리의 일치 항목 만 제공합니다. (하위 디렉토리를 보지 않음)
내가 시도 find . -name *test.c
하면 동일한 결과를 기대하지만 대신 하위 디렉토리에있는 일치 항목 만 제공합니다. 작업 디렉토리에 일치 해야하는 파일이 있으면 다음을 제공합니다.find: paths must precede expression: mytest.c
이 오류는 무엇을 의미하며 현재 디렉토리와 해당 서브 디렉토리 모두에서 일치 항목을 가져 오는 방법
답변
따옴표로 묶어보십시오-쉘의 와일드 카드 확장을 사용하고 있으므로 acually 전달하는 항목은 다음과 같습니다.
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