왜 찾기가 재귀하지 않습니까?


65

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

find . -name *.java

현재 디렉토리에 Java 파일이 더 아래에 있지만 find현재 디렉토리에서만 수행하고 있음 을 알고 있습니다 . OS X 10.9를 사용하고 있습니다.


@Gilles :이 Q & A는 속임수보다 훨씬 명확하고 지역화되지 않았습니다. 둘 중 하나를 닫아야하는 경우 다른 쪽입니다.
goldilocks

답변:


88

문제는 -name매개 변수를 인용하지 않았다는 것 입니다. 대신이 작업을 수행하십시오.

find . -name '*.java'

설명

따옴표가 없으면 쉘 *.java은 glob 패턴으로 해석 하여에 전달하기 전에 glob와 일치하는 파일 이름으로 확장합니다 find. 이 방법은 당신이 있던 경우에, 말하자면, foo.java현재 디렉토리에서 find의 실제 명령 줄은 다음과 같습니다

find . -name foo.java

이것은 분명히 현재 디렉토리에만 파일을 나열합니다 (트리에 더 비슷한 이름의 파일이 더 없다면).

인용은 glob 확장을 방지하고 명령 행을 find그대로 전달합니다 .

또한, glob가 일치하지 않으면 ( *.java현재 디렉토리에 파일이 없는 경우 ), 일치하지 않는 glob를 처리하도록 쉘이 설정되는 방식에 따라 두 가지 동작 중 하나가 발생합니다 ( nullglobBash 의 옵션에 의해 관리 됨). 예를 들어) :

  1. 맞지 않는 글로브가 쉘에 의해 확장되지 않으면 find(실수로 당신을 염두에 두어야합니다) 올바른 동작을 나타냅니다.
  2. 일치하지 않는 glob가 쉘에 의해 빈 문자열로 확장 find되면에 대한 인수가 누락되었다고 불평합니다 -name.

20

나는 따옴표로 -name 값을 둘러싼 상황과 비슷한 상황이 있었지만 여전히 내가 기대했던 모든 찾기 히트를 얻지 못했습니다. 나는 그것이 심볼릭 링크 때문이라고 생각했고 충분히 사실이었다. 심볼릭 링크를 통해 강제로 찾기를 수행하려면 명령을 다음과 같이 수정할 수 있습니다.

find -L . -name '*.java'

Symlinks도 내 문제였습니다. -follow-L다른 매개 변수 앞에두기 만하면 더 읽기 쉬운 동의어입니다 .
누 메논

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