Dengan asumsi penggunaan chmod
dari GNU coreutils paket pada Ubuntu 12.10.
chmod 775 . -R
mengeksekusi fchmodat
panggilan sistem untuk setiap file yang ditemukan terlepas dari apakah izin perlu diubah atau tidak. Saya mengkonfirmasi ini dengan memeriksa kode dan menggunakan strace chmod 775 . -R
(snippet di bawah) untuk membuat daftar perilaku yang sebenarnya.
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
Ada beberapa kelemahan berjalan fchmodat
di setiap file
- Panggilan sistem tambahan kemungkinan akan menjadi signifikan jika sejumlah besar file diubah. The
find
/ xargs
/chmod
yang disebutkan oleh orang lain kemungkinan akan lebih cepat dengan hanya mengubah file yang perlu diubah.
- Panggilan untuk
fchmodat
mengubah modifikasi status file (waktu) dari setiap file. Ini akan menyebabkan setiap file / inode berubah setiap waktu dan kemungkinan akan menyebabkan kelebihan penulisan disk. Dimungkinkan untuk menggunakan opsi mount untuk menghentikan kelebihan penulisan ini.
Eksperimen sederhana menunjukkan perubahan waktu yang terjadi secara langsung 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
Tetapi ini tidak berubah untuk find
/ xargs
/ chmod
beberapa menit kemudian
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
Saya akan selalu cenderung menggunakan versi find
/ xargs
/ chmod
karena find memberi lebih banyak kontrol untuk memilih sesuatu.