조회가 재귀적이지 않은 이유는 무엇입니까?

조회가 재귀적이지 않은 이유는 무엇입니까?

다음 명령을 실행하고 있지만 재귀적으로 실행되지 않습니다.

find . -name *.java

현재 디렉토리에 java 파일도 있다는 것을 알고 있지만 find현재 디렉토리에서만 실행됩니다. 저는 OS X 10.9를 사용하고 있습니다.

답변1

문제는 매개변수를 인용하지 않는다는 것입니다 -name. 대신 이렇게 하세요:

find . -name '*.java'

설명하다

따옴표가 없으면 쉘은 이를 *.javaglob 패턴으로 해석하고 에 전달하기 전에 glob과 일치하는 파일 이름으로 확장합니다 find. 이런 식으로 foo.java현재 디렉토리에 있는 경우 find실제 명령줄은 다음과 같습니다.

find . -name foo.java

분명히 이는 현재 디렉터리의 파일만 나열합니다(트리 아래에 비슷한 이름의 파일이 있는 경우 제외).

인용은 전역 확장을 방지하고 find명령줄을 있는 그대로 전달합니다.

그런데 glob을 일치시킬 수 없는 경우( *.java현재 디렉터리에 파일이 없음) 일치하지 않는 glob을 처리하도록 쉘을 설정하는 방법에 따라 두 가지 동작 중 하나를 얻게 됩니다( nullglobBash의 옵션으로 제어됨).

  1. 쉘이 일치하지 않는 glob을 확장하지 않으면 find(예기치 않게) 올바른 동작을 나타냅니다.
  2. 쉘이 일치하지 않는 glob을 빈 문자열로 확장하면 find누락되었다고 불평합니다 -name.

답변2

-name 값을 따옴표로 묶었지만 여전히 내가 기대했던 조회 결과를 모두 얻지 못하는 비슷한 상황이 발생했습니다. 나는 그것이 심볼릭 링크 때문이라고 추측했고, 확실히 그랬습니다. find를 심볼릭 링크를 통해 강제로 검색하려면 명령을 다음과 같이 수정하면 됩니다.

find -L . -name '*.java'

답변3

도망가다*

find . -name \*.java

관련 정보