여러 개의`-name`과`-exec`가있는`find`는`-name`의 마지막 일치 만 실행합니다.


74

내가 사용할 때

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) 사용


힌트 : 첫 번째 명령은 인쇄 할 디렉토리 이름이 일치 *.js*또는 *.txt.
와일드 카드

답변:


99
검색 . -type f -name "* .htm *"-o -name "* .js *"-o -name "* .txt"

짧다 :

검색 . \ (\ ( -type f -a -name "* .htm *" \) -o \
          \ ( -name "* .js *" \) -o \
          \ ( -name "* .txt" \) \
       \) -a-인쇄

즉, 조치 술어가 지정 되지 않았기 때문에 ( condition 만 해당 ), -print조건과 일치하는 파일에 대한 조치가 내재적으로 추가됩니다.

(그리고 그것은 비정규 .js파일을 인쇄 합니다 (파일 -type f에만 적용됩니다 .htm)).

동안:

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

짧다 :

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

의 경우 find(여러 언어 등) ( -a; 생략하는 경우 암시 적)을 통해 우선 순위가 OR ( -o), 및 명시 적 액션 술어를 (여기에 추가하는 -exec)이 취소 -print위의 볼 암시 적 조치를. 여기, 당신은 원한다 :

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

또는:

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

sh파일 당 하나를 실행하지 않기 위해 .


sh -c가 사용하는 일부에서는 sh에 대해 0 번째 인수를 추가해야합니다 (다른 경우에는 이미 포함 시켰음).
James Youngman

1
좋은 대답입니다!
Marinos An

30

묵시적인 대괄호입니다. 명시적인 대괄호를 추가하십시오.\( \)

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