디렉터리의 모든 파일을 CHOWN하는 스크립트를 작성하지만 그 안의 특정 디렉터리는 건너뜁니다.

디렉터리의 모든 파일을 CHOWN하는 스크립트를 작성하지만 그 안의 특정 디렉터리는 건너뜁니다.

그래서 OS를 재부팅한 후 다음 시작 스크립트를 실행했습니다.

  • 설치 드라이버
  • 마운트 Z풀
  • 사용자 및 SMB 사용자와 SMB 공유를 추가합니다.

새 OS에서 살아남은 유일한 것은 대부분의 파일이 bob이 소유한 Zpool이었고 민감한 콘텐츠로 인해 내 docker 볼륨 폴더에 있는 일부 파일이 루트가 소유했다고 가정해 보겠습니다.

내 스크립트에서는 Zpool의 모든 파일을 사용 sudo chown -R하지만 루트가 파일과 디렉터리를 소유하기 때문에 그렇게 하고 싶지 않다는 것을 알았습니다. 도커 볼륨의 소유권을 그대로 유지하고 싶습니다.

그래서 제가 정말로 원하는 것은 이 특정 폴더에서 "root"가 소유한 파일을 변경하지 않고 예시 "bob" 사용자가 소유한 파일의 소유권을 이전 상태에서 현재 상태로 변경하는 것입니다.

  • chownZpool의 모든 파일을 보고 그 안에 있는 특정 폴더를 완전히 건너뛸 수 있습니까 ?
  • chown동일한 운영 체제를 새로 설치할 때마다 내 사용자 이름이 변경되지 않는 경우에도 모든 파일이 필요합니까?
  • 다른 운영 체제는 어떻습니까?

감사합니다

답변1

sudo find /zpool -path /zpool/some/dir/to/exclude -prune -o \
  -exec chown -h someuser:somegroup {} +

GNU를 사용하면 chown특정 user:group이 소유한 파일만 chown할 수도 있습니다.

sudo chown -Rh --from=user:group someuser:somegroup /zpool

(그룹과 관계없이 그룹이 소유한 파일의 경우 --from=user또는 사용자와 관계없이 그룹이 소유한 파일의 경우)user--from=:groupgroup

표준에 해당하는 것은 다음과 같습니다.

sudo find /zpool -user user -group group \
  -exec chown -h someuser:some group {} +

답변2

find에서 -prune 연산자를 사용해 볼 수 있습니다:

조금 무섭게 들리지만 이것이 하는 일은 find 처리를 정리하는 것입니다.

다시 말하지만, 파일이 /zpool에 있으면 이 방법이 작동합니다.

find /zpool -user root -prune -o -exec chown user:group {} \;

루트가 소유하지 않은 모든 파일을 user:group이 소유하도록 변경해야 합니다. 당신이 달릴 수 있는지 확인하기 위해서

find /zpool -user root -prune -o -exec echo {} ;\

예상한 파일을 얻었는지 확인하세요.

-o는 찾기 또는 연산자입니다. 이 경우 "이전 항목이 일치하지 않으면 다음 항목을 수행합니다."와 같이 작동합니다.

두 가지 다른 질문을 합니다. 루트가 소유한 것을 제외한 모든 것의 소유자를 변경하려면 find 명령이 작동해야 합니다. 하지만 특정 하위 디렉터리의 콘텐츠를 제외한 모든 항목도 언급했는데, 이 경우 다음을 수행합니다.

/zpool -name dir_with_secret_stuff -prune -o -exec chown user:group {} 찾기;

파일의 사용자 이름은 실제로 사용자 이름이 아니라 숫자로 된 사용자 ID에 연결되어 있으므로 디스크에 bob이라는 사용자 1000이 소유한 파일이 있는 경우 ls -l은 해당 파일을 bob all로 나열합니다. 사용자 1000이 nobob이라는 시스템에 디스크를 마운트하면 ls -l은 해당 디스크를 nobob이 소유한 것으로 나열하고, 사용자 1000이 없는 시스템에 디스크를 마운트하면 사용자 1000이 소유한 것으로만 표시됩니다. 귀하의 사용자 이름과 사용자 ID는 동일하게 유지되며 해당 파일 소유권도 동일하게 유지됩니다.

답변3

폴더가 디렉터리 계층 구조의 어느 위치에나 있을 수 있다면 모든 파일과 디렉터리를 개별적으로 조작해야 한다고 생각합니다.

Zpool이 설치되어 /zpool있고 제외하려는 디렉토리가 이라고 가정 /zpool/subdirectory/secret stuff하면 이와 같은 것이 작동할 수 있습니까?

for item in "$(find /zpool -print | grep -v '/zpool/sudirectory/secret stuff')"; do
    sudo chown user:group "$item"
done

물론 사용자와 그룹을 사용하려는 것으로 바꿀 수 있습니다 :-)

이렇게 하면 find bin -print | grep -v '/zpool/sudirectory/secret stuff'"secret stuff" 디렉터리에 있는 파일과 폴더를 제외하고 "/zpool"에 있는 모든 파일 및 폴더 목록이 제공되며 목록의 모든 항목을 간단히 표시할 수 있습니다.

사용자 이름 문제와 관련하여 중요한 것은 사용자 ID(UID)입니다. idUID가 변경되지 않은 경우에는 문제가 없는 것입니다 .

관련 정보