Kullanımını varsayarsak chmod
gelen GNU coreutils paketiyle Ubuntu 12.10 üzerinde.
chmod 775 . -R
fchmodat
izinlerin değişmesi gerekip gerekmediğine bakılmaksızın bulduğu her dosya için sistem çağrısını yürütür . Bu kodu inceleyerek ve strace chmod 775 . -R
gerçek davranışı listelemek için (aşağıda snippet) kullanarak bunu doğruladım .
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
Her dosya üzerinde çalışmanın birkaç dezavantajı vardır
- Çok sayıda dosya değiştirilirse, ekstra sistem çağrısı önemli hale gelecektir.
find
/ xargs
/chmod
Başkaları tarafından bahsedilen yöntem büyük olasılıkla yalnızca değiştirilmesi gerektiğini dosyaları değiştirerek daha hızlı olacaktır.
- Çağrı
fchmodat
dosyanın dosya durumu değişikliğini (ctime) değiştirme . Bu, her dosya / inode'un her seferinde değişmesine neden olur ve büyük olasılıkla fazla disk yazılmasına neden olur. Bu fazla yazmaları durdurmak için bağlama seçeneklerini kullanmak mümkün olabilir.
Basit bir deney, düz için gerçekleşen ctime değişikliklerini gösterir 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
Ancak bu, find
/ xargs
/ chmod
birkaç dakika sonra değişmez
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
Ben her zaman find
/ xargs
/ chmod
sürümünü kullanma eğiliminde olur çünkü find şeyler seçerken daha fazla kontrol sağlar.