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
에서는오직운영자.