여러 개의 '-name' 및 '-exec'가 있는 'find'는 마지막으로 나타나는 '-name'만 실행합니다.

여러 개의 '-name' 및 '-exec'가 있는 'find'는 마지막으로 나타나는 '-name'만 실행합니다.

내가 사용할 때

find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"

모든 유형의 파일을 찾습니다. 하지만 -exec마지막에 추가하면 다음과 같습니다.

find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} \;

.txt파일 만 인쇄하는 것 같습니다 . 내가 뭘 잘못했나요?

참고: MINGW(Git Bash)를 사용하세요.

답변1

찾다. -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"

약어는 다음과 같습니다.

찾다.'('\
           '('-f 유형-ㅏ-이름 "*.htm*"')'-영형\
           '('-이름 "*.js*"')'-영형             \
           '('-이름 "*.txt"')' \
       ')' -인쇄

즉, 없기 때문이다.행동술어가 지정됨(만상황), -print기준을 충족하는 파일에 대한 작업을 암시적으로 추가합니다.

(그런데 이렇게 하면 비정규 .js파일이 인쇄됩니다( 파일 -type f에서만 작동함 .htm).

하지만:

찾다. -name "*.htm*" -o -name "*.js*" -o -name "*.txt"\
  -exec sh -c 'echo "$0"' {} \;

약어는 다음과 같습니다.

찾다.'('-f 유형-ㅏ-이름 "*.htm*"')'-영형\
       '('-이름 "*.js*"')'-영형\
       '('-이름 "*.txt"-ㅏ-exec sh -c 'echo "$0"' {} \;')'

(많은 언어와 마찬가지로 find)그리고( -a; 생략 시 암시적)이 우선 적용됩니다.또는( -o), 명시적 연산 조건자(여기 -exec) 를 추가하면 -print위에서 본 암시적 연산이 취소됩니다.

원하는 곳은 다음과 같습니다.

find . '(' -name "*.htm*" -o -name "*.js*" -o -name "*.txt" ')' \
       -type f \
       -exec sh -c 'echo "$0"' {} \;

또는:

find . '(' -name "*.htm*" -o -name "*.js*" -o -name "*.txt" ')' \
       -type f \
       -exec sh -c '
         for i do
           echo "$i"
         done' sh {} +

sh파일당 하나씩 실행되지 않도록 합니다 .

( -type f인덱스 노드에서 정보를 검색하는 것보다 비용이 더 많이 들기 -name때문에뒤쪽에일부 find구현에서는 최적화를 위해 내부적으로 재정렬 검사를 수행하지만).

답변2

이는 암시적 괄호입니다. 명시적인 괄호를 추가합니다.\( \)

find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -exec sh -c 'echo "$0"' {} \;

또는 xargs를 사용하십시오(나는 xargs를 좋아합니다. 더 쉽다고 생각하지만 분명히 이식성은 떨어집니다).

find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -print0 | xargs -0 -n1 echo

관련 정보