"찾기 : 경로가 식 앞에 와야합니다."현재 디렉토리에서 파일을 찾는 재귀 검색을 어떻게 지정합니까?


235

현재 디렉토리와 하위 디렉토리에서 일치하는 항목을 찾는 데 어려움을 겪고 있습니다.

내가 실행할 때 find *test.c현재 디렉토리의 일치 항목 만 제공합니다. (하위 디렉토리를 보지 않음)

내가 시도 find . -name *test.c하면 동일한 결과를 기대하지만 대신 하위 디렉토리에있는 일치 항목 만 제공합니다. 작업 디렉토리에 일치 해야하는 파일이 있으면 다음을 제공합니다.find: paths must precede expression: mytest.c

이 오류는 무엇을 의미하며 현재 디렉토리와 해당 서브 디렉토리 모두에서 일치 항목을 가져 오는 방법


4
기록을 위해, findmsysgit 따옴표와 패턴을 둘러싸고하지 않는 한이 오류가 발생 할 수 있습니다 find . -name "*test.c". (Windows find.exe와 다른 것을 선호하고 cmd와 다른 것을 선호하는 경우 )
n611x007

답변:


393

따옴표로 묶어보십시오-쉘의 와일드 카드 확장을 사용하고 있으므로 acually 전달하는 항목은 다음과 같습니다.

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

구문 오류가 발생했습니다. 대신 이것을 시도하십시오 :

find . -name '*test.c'

파일 표현식 주위의 작은 따옴표는 와일드 카드 확장을위한 쉘 (bash)을 중지시킵니다.


15
예를 들어, 그렇게하면 무슨 일이 일어나고 있는지 알 수 있습니다 echo *test.c... 결과는 와일드 카드를 확장하는 에코가 아니라 쉘 자체입니다. 간단한 교훈은 와일드 카드를 사용하는 경우 filespec을 인용하는 것입니다. :-)
Chris J

이 VARIANT를 도와 주셔서 감사합니다. 나는 find . -type f -printf ‘%TY-%Tm-%Td %TT %p\n’웹에서 찾은 것처럼 "경로가 식 앞에 와야한다"라는 메시지를 받았다. 문제는 따옴표가 "똑똑하다"는 것이었다. 따옴표를 바꾸고 명령을 다시 입력하여 실행했습니다.
Smandoli

2
어떤 이유로 작은 따옴표가 나에게 도움이되지 않았습니다. 큰 따옴표를 사용해야했습니다. ¯ \ _ (ツ) _ / ¯
Planky

와일드 카드 검색을위한 작은 따옴표는 Busybox 및 GNU에서 작동했습니다 find. 와일드 카드 *.$variable를 사용하는 경우 큰 따옴표가 필요합니다.
스튜어트 Cardall

@Planky : 쉘 스크립트 파일에 find, -name 'write.lock'을 넣었지만이 오류 메시지가 있습니다. 그러나 콘솔에 입력하면 작동합니다. 아무도 이유를 알고 있습니까?
Scott Chu

28

일어나고있는 일은 쉘이 "* test.c"를 파일 목록으로 확장하고 있다는 것입니다. 별표를 다음과 같이 탈출하십시오.

find . -name \*test.c

#gitbash이 창에 자식 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

-o또는 -or논리 OR입니다. 자세한 내용 은 Gnu.org 에서 파일 찾기 를 참조하십시오.

CygWin에서 이것을 실행했습니다.


-1

내 경우 /에는 경로에서 후행이 누락되었습니다 .

find /var/opt/gitlab/backups/ -name *.tar

1
후행 /은 필요하지 않습니다.
melpomene
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.