이것은 재귀적 "chmoding"에 대한 보다 일반적인 질문입니다.
어느 시점에서 수십만 개의 파일이 포함된 폴더의 사용 권한을 반복적으로 변경해야 하는 이 스크립트가 있습니다. 매일 새 파일이 폴더에 추가되지만 기존 파일에는 권한이 설정되어 변경되지 않습니다.
내 문제는... 내가 전화할 때
chmod 775. -아르 자형
이미 올바른 권한이 설정된 파일에 대해 권한을 설정하려고 합니까, 아니면 올바른 권한이 없는 새 파일에 대해서만 권한을 설정합니까?
"새" 파일이 수천 개에 불과하고 해당 권한을 상당히 빠르게 적용해야 함에도 불구하고 스크립트에서 이 명령을 실행하는 데는 항상 오랜 시간이 걸리는 것 같습니다.
chmod에 대한 매뉴얼 페이지를 살펴봤지만 이 상황에 대해서는 아무 것도 언급하지 않는 것 같습니다.
chmod가 사전에 권한을 확인하지 않으면 "find"와 "chmod"를 결합하는 것을 고려해야 합니까?
답변1
찾기/chmod 최적화
둘 다 읽어야 find
함chmod
- 모든 디렉토리 항목
- 이 모든 항목의 인덱스 노드
모든 항목을 먼저 읽은 다음 회전 디스크의 모든 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
chmod
from을 사용한다고 가정GNU coreutils 패키지우분투 12.10에서.
chmod 775 . -R
fchmodat
권한을 변경해야 하는지 여부에 관계없이 찾은 모든 파일에 대해 시스템 호출을 수행합니다 . 코드를 검사하고 (아래 스니펫)을 사용하여 실제 동작을 나열하여 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
각 파일에서 실행하면 몇 가지 단점이 있습니다.
- 많은 수의 파일을 변경하면 추가 시스템 호출이 커질 수 있습니다. // 다른 분들이 언급한 방법은 변경이 필요한 파일
find
만xargs
변경 하면 더 빠를 수도 있습니다.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
//몇 분 후에도xargs
chmod
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를 살펴보는 것이 도움이 될 수 있습니다.