수천 개의 파일에 대한 chmod 재귀 권한

수천 개의 파일에 대한 chmod 재귀 권한

이것은 재귀적 "chmoding"에 대한 보다 일반적인 질문입니다.

어느 시점에서 수십만 개의 파일이 포함된 폴더의 사용 권한을 반복적으로 변경해야 하는 이 스크립트가 있습니다. 매일 새 파일이 폴더에 추가되지만 기존 파일에는 권한이 설정되어 변경되지 않습니다.

내 문제는... 내가 전화할 때

chmod 775. -아르 자형

이미 올바른 권한이 설정된 파일에 대해 권한을 설정하려고 합니까, 아니면 올바른 권한이 없는 새 파일에 대해서만 권한을 설정합니까?

"새" 파일이 수천 개에 불과하고 해당 권한을 상당히 빠르게 적용해야 함에도 불구하고 스크립트에서 이 명령을 실행하는 데는 항상 오랜 시간이 걸리는 것 같습니다.

chmod에 대한 매뉴얼 페이지를 살펴봤지만 이 상황에 대해서는 아무 것도 언급하지 않는 것 같습니다.

chmod가 사전에 권한을 확인하지 않으면 "find"와 "chmod"를 결합하는 것을 고려해야 합니까?

답변1

찾기/chmod 최적화

둘 다 읽어야 findchmod

  1. 모든 디렉토리 항목
  2. 이 모든 항목의 인덱스 노드

모든 항목을 먼저 읽은 다음 회전 디스크의 모든 inode를 읽어 성능을 향상시킬 수 있습니다. 그 이유는 디스크 헤드가 디렉터리와 inode 사이를 이동하지 않기 때문입니다. ~처럼chmod 어리석게도 (다른 답변 중 하나가 설명했듯이) find호출해야합니다. 하지만 그렇더라도 첫 번째 inode가 작성되기 전에 모든 inode를 읽는 것이 도움이 될 수 있습니다(디스크 캐싱을 위한 여유 RAM이 충분하다고 가정). 나는 이것을 제안한다:

find . -printf "" # reading the file names only
find . ! -perm 775 -printf "" # reading all the inodes (file names are cached)
find . ! -perm 775 -exec chmod 775 + # writing to the cache without reading from disk

좋은 솔루션: ACL

좋은 해결책은 완전히 다른 것일 수 있습니다. 파일이 이 디렉토리에서 생성되고 다른 곳에서 이동되지 않은 경우 ACL은 즉시 작업을 수행할 수 있습니다. 상위 디렉터리에 기본 ACL을 설정하기만 하면 됩니다.

파일 시스템 최적화를 통해 추가 개선을 달성할 수 있습니다. ext3/ext4인 경우 e2fsck -D수시로 실행할 수 있습니다. 아마도 이 디렉토리를 별도의 볼륨에 두는 것이 도움이 될 것입니다. 다른 파일 시스템이나 파일 시스템 설정(예: 다른 inode 크기)을 시도해 볼 수 있습니다.

답변2

chmodfrom을 사용한다고 가정GNU coreutils 패키지우분투 12.10에서.

chmod 775 . -Rfchmodat권한을 변경해야 하는지 여부에 관계없이 찾은 모든 파일에 대해 시스템 호출을 수행합니다 . 코드를 검사하고 (아래 스니펫)을 사용하여 실제 동작을 나열하여 strace chmod 775 . -R이를 확인했습니다 .

newfstatat(4, "d", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "d", 0775)                  = 0
newfstatat(4, "c", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "c", 0775)                  = 0
newfstatat(4, "a", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "a", 0775)                  = 0
newfstatat(4, "b", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "b", 0775)                  = 0

fchmodat각 파일에서 실행하면 몇 가지 단점이 있습니다.

  • 많은 수의 파일을 변경하면 추가 시스템 호출이 커질 수 있습니다. // 다른 분들이 언급한 방법은 변경이 필요한 파일 findxargs변경 하면 더 빠를 수도 있습니다.chmod
  • fchmodat각 파일의 상태를 변경하는 파일 수정(ctime)을 호출합니다 . 이로 인해 모든 파일/inode가 매번 변경되고 과도한 디스크 쓰기가 발생할 수 있습니다. 이러한 중복 쓰기는 마운트 옵션을 사용하여 중지할 수 있습니다.

간단한 실험은 직접적으로 발생하는 ctime 변화를 보여줍니다.chmod

auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 d
auser@duncow:/tmp/blah.test$ chmod 775 . -R
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 d

하지만 그것은 변하지 않았습니다 find//몇 분 후에도xargschmod

auser@duncow:/tmp/blah.test$ date
Tue Jun 18 18:27:27 BST 2013
auser@duncow:/tmp/blah.test$ find . ! -perm 775 -print0 | xargs -0 -I {} chmod 775 {}
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 d

find나는 항상 // 버전을 사용하는 경향이 있는데, find를 사용하면 선택된 항목을 더 잘 제어할 수 있기 xargs때문입니다 .chmod

답변3

chmod원하는 대로 설정된 파일에 대한 권한을 변경할 수도 있고 변경하지 않을 수도 있지만, 그렇지 않은 경우에도 현재 권한이 무엇인지 확인해야 합니다[0]. 수십만 개의 파일이 있으므로 각 파일을 검사하는 데 시간이 소요될 가능성이 높습니다 stat.

find마지막 실행보다 최신 파일이나 chmod실행해야 하는 파일 확인을 사용해 볼 수 있지만 속도가 크게 향상되지는 않을 것 같습니다.

스크립트를 사용하여 가능하다면 먼저 새 파일을 "보류" 영역으로 별도의 디렉터리에 넣을 수 있습니다. 그런 다음 해당 디렉토리의 나머지 파일과 함께 넣을 수 있습니다 chmod(새 파일만 포함) . mv이 방법은 훨씬 더 빠르지만 불행하게도 모든 애플리케이션에서 작동하는 것은 아닙니다.

[0] 변경이 필요하지 않은 파일에 대한 권한을 설정하려고 시도하더라도 기본 파일 시스템은 불필요하기 때문에 요청에 대해 어떤 작업도 수행하지 않을 수 있습니다.

답변4

파일을 생성하는 프로세스를 0775 모드를 사용하여 파일을 생성하도록 변경하는 것을 고려해 보셨나요? 귀하의 환경에서 umask 값인 0002를 살펴보는 것이 도움이 될 수 있습니다.

관련 정보