Ubuntu 12.10 chmod
의 GNU coreutils 패키지 를 사용한다고 가정합니다 .
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)을 변경합니다. 이로 인해 매번 모든 파일 / 노드가 변경되고 디스크 쓰기가 과도하게 발생할 수 있습니다. 마운트 옵션을 사용하여 이러한 초과 쓰기를 중지 할 수 있습니다.
간단한 실험은 직선에 대한 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
/ xargs
/ chmod
버전 을 사용하는 경향이 있습니다 .