Giả sử việc sử dụng chmod
từ gói GNU coreutils trên Ubuntu 12.10.
chmod 775 . -R
thực hiện lệnh fchmodat
gọi hệ thống cho mỗi tệp mà nó tìm thấy bất kể các quyền có cần thay đổi hay không. Tôi đã xác nhận điều này bằng cách kiểm tra mã và sử dụng strace chmod 775 . -R
(đoạn trích bên dưới) để liệt kê hành vi thực tế.
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
Có một vài nhược điểm của việc chạy fchmodat
trên mỗi tệp
- Cuộc gọi hệ thống bổ sung có thể sẽ trở nên quan trọng nếu một số lượng lớn tệp được thay đổi. Các
find
/ xargs
/ chmod
phương pháp được đề cập bởi những người khác có thể sẽ nhanh hơn bằng cách chỉ thay đổi file mà không cần thay đổi.
- Cuộc gọi để
fchmodat
thay đổi sửa đổi trạng thái tệp (ctime) của mỗi tệp. Điều này sẽ khiến mỗi tệp / inode thay đổi mỗi lần và có thể sẽ gây ra tình trạng ghi đĩa quá mức. Có thể sử dụng các tùy chọn gắn kết để dừng các ghi thừa này.
Một thử nghiệm đơn giản cho thấy những thay đổi thời gian xảy ra cho thẳng 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
Nhưng điều này không thay đổi trong find
/ xargs
/ chmod
vài phút sau
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
Tôi sẽ luôn luôn có xu hướng sử dụng find
/ xargs
/ chmod
phiên bản vì tìm cho kiểm soát tốt hơn việc lựa chọn mọi thứ.