สมมติว่าใช้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
/ chmod
version เพราะ find ช่วยให้สามารถควบคุมสิ่งที่เลือกได้มากขึ้น