내가 사용할 때
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