find -exec와 xargs를 통한 파이핑 간의 동작이 다릅니다.

find -exec와 xargs를 통한 파이핑 간의 동작이 다릅니다.

chmod go+w숨겨진 파일을 포함하여 특정 폴더에서 재귀적으로 실행하고 싶은데 먼저 시도했습니다.

find . -name ".*" -o -name "*" -exec chmod go+w {} \;

하지만 숨겨진 파일에는 영향을 미치지 않는다는 것을 알았습니다. 내 자신을 확인하기 위해 달렸어요

find . -name ".*" -o -name "*"

숨겨진 파일을 나열합니다. 또한 해당 섹션을 제외하면 숨겨진 파일이 chmods된다는 사실도 확인했습니다 -o -name "*"(물론 숨김이 아닌 파일은 제외됨). 내 마지막 시도는 대신 xargs를 사용하는 것이었습니다

find . -name ".*" -o -name "*" | xargs chmod go+w

마침내 예상대로 작동했습니다. 첫 번째 스니펫에서 내가 무엇을 잘못했나요?

Red Hat Enterprise Linux 서버 버전 6.8(샌디에고)

GNU bash, 버전 4.3.42(1)-릴리스(x86_64-unknown-linux-gnu)

답변1

해결책은 두 개의 이름 테스트를 함께 묶는 것입니다.

이를 설명하기 위해 세 개의 일반 파일이 포함된 디렉터리를 고려해 보겠습니다.

$ ls -a
.  ..  .hidden1  .hidden2  not_hidden

이제 원래 명령을 살펴보겠습니다.

$ find . -name ".*" -o -name "*" -exec echo Found {} \;
Found ./not_hidden

숨겨지지 않은 파일만 발견됩니다.

다음으로 두 개의 이름 테스트를 함께 그룹화하기 위해 괄호를 추가해 보겠습니다.

$ find . \( -name ".*" -o -name "*" \) -exec echo Found {} \;
Found .
Found ./not_hidden
Found ./.hidden1
Found ./.hidden2

모든 파일을 찾았습니다.

해결책은 괄호를 사용하는 것입니다.

자세한 내용은

-name "*"원래 명령에서는 와 사이에 연산자가 없습니다 -exec ... \;. 따라서 find기본 연산자는 논리 AND로 간주됩니다. 논리 AND는 논리 OR( )보다 더 밀접하게 바인딩되어 있으므로 -o명령이 다음과 같이 해석됩니다.

find . \( -name ".*" \) -o \( -name "*" -exec echo Found {} \; \)

즉, 첫 번째 조건이 일치하지 않는 exec경우에만 실행 됩니다.name

자세한 내용은 다음을 참조하세요.운영자에 참여 man find.

그렇지 않다면 어떻게 될까요?-exec

간단한 것을 사용해 봅시다 -print:

$ find . -name ".*" -o -name "*" -print
./not_hidden

보시 다시피 위의 암시적 논리 "and"와 -print함께 연결됩니다 .-name "*"

그러나 작업이 지정되지 않으면 어떤 일이 발생하는지 고려하십시오.

$ find . -name ".*" -o -name "*"
.
./not_hidden
./.hidden1
./.hidden2

이 시점에서 모든 파일이 발견되었습니다. 그 이유는 이 버전 -o에서는오직운영자.

관련 정보