สมมติว่าใช้chmodจากแพ็คเกจ GNU coreutilsบน Ubuntu 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 เปลี่ยนไปในแต่ละครั้งและอาจทำให้เกิดการเขียนดิสก์มากเกินไป อาจเป็นไปได้ที่จะใช้ตัวเลือกการเมานต์เพื่อหยุดเขียนส่วนเกินเหล่านี้
การทดลองอย่างง่ายแสดงให้เห็นว่าการเปลี่ยนแปลงเวลาเกิดขึ้นโดยตรง 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/ chmodversion เพราะ find ช่วยให้สามารถควบคุมสิ่งที่เลือกได้มากขึ้น