하나의 명령으로 권한과 소유자를 변경하여 리소스를 보호하세요.

하나의 명령으로 권한과 소유자를 변경하여 리소스를 보호하세요.

다음 기능을 가진 백업 스크립트가 있습니다.

function change_rights()
{
    chown -R ${OWNER}:${GROUP} ${DIR}
    find ${DIR} -type f -exec chmod 0640 {} \;
    find ${DIR} -type d -exec chmod 0770 {} \;
}

이제 문제는 이것이 ${DIR}규모가 크고 소유자와 권한을 변경하려면 디렉토리를 최소한 두 번 통과해야 하며 이는 극도로 리소스 집약적이라는 것입니다.

소유자를 변경하는 방법이나 명령이 있습니까?그리고오른쪽동시에? 즉, inode의 내용이 한꺼번에 바뀌는 걸까요?

저는 ext4파일 시스템 작업을 하고 있습니다.

답변1

find를 사용하는 대신, 숨겨진 파일을 glob하고 재귀적 globbing을 수행하는 데 필요한 셸 옵션을 설정한 다음 다음과 같은 작업을 수행할 수 있습니다.

for entry in ${DIR}/**/**; do
  chown "${OWNER}:${GROUP}" "${entry}"
  if [[ -d "${entry}" ]] ; then
    # do the thing you do on directories
  else
    # do the thing you do on files
fi

그러나 솔직히 두 번 살펴보는 대신 수천 개의 프로세스를 생성하는 오버헤드는 chown아마도 두 번 살펴보는 대신 셸 논리에서 파일인지 확인하는 것과 같을 가치가 없을 것입니다. 결국은 직접 벤치마킹해야 합니다.

내가 찾은 구문은 find때때로 약간 혼란스러웠지만, 나에게 도움이 된 구문은 다음과 같습니다.

find  \( -exec /usr/bin/echo ${OWNER}:${GROUP} '{}' \; \) \
-a \( \
      \( -type f -exec /usr/bin/echo 0640 '{}' \; \) \
   -o \( -type d -exec /usr/bin/echo 0770 '{}' \; \) \
   \)

그 의미를 이해한 후에는 / echo로 바꾸십시오 chown.chmod

여기서 문제는 디렉토리에 들어가기 전에 먼저 디렉토리 권한을 변경한다는 것입니다. 나중에 직접 읽고 나열할 수 없으면 오류가 발생할 수 있습니다.

매우 거대하다

수백만 개의 파일이 있다면 표준 설정을 사용하여 ext4보다 해당 사용 사례에 더 적합한 것을 사용하는 것을 고려해 보십시오. 솔직히 제가 수집한 소스 트리를 사용하더라도 실제로는 시간이 많이 걸리지 않습니다.

관련 정보