เปลี่ยนการอนุญาตไฟล์ซ้ำ แต่ไม่ใช่ไดเรกทอรี?


13

ฉันทำการเปลี่ยนแปลงการอนุญาตซ้ำหลายครั้งของไฟล์บางไฟล์ที่ฉันย้ายไปยังระบบยูนิกซ์ ฉันเปลี่ยนเป็น ug + rw แต่ฉันพบว่าฉันไม่สามารถข้ามไดเรกทอรีย่อยได้ ฉันดูที่ man page สำหรับchmodและไม่เห็นคำอธิบายใด ๆ สำหรับการยกเว้นไดเรกทอรีดังนั้นฉันจึง googled เพียงเล็กน้อยและพบว่าผู้คนเคยfindเปลี่ยนสิทธิ์แบบเรียกซ้ำในไดเรกทอรีเป็น 'execute' สำหรับผู้ใช้และกลุ่ม ฉันทำอย่างนั้นและจากนั้นฉันสามารถตรวจสอบพวกเขา

แต่สำหรับฉันแล้วฉันควรจะสามารถค้นพบสิ่งนี้ได้chmod- เปลี่ยนไฟล์ซ้ำเพื่ออ่าน / เขียน แต่ไม่ทำให้ไดเรกทอรีไม่สามารถย้อนกลับได้ ฉันได้ทำสิ่งนี้ 'ถูกต้อง' หรือมีวิธีที่ง่ายกว่าในการทำมันหรือไม่?

คำตอบ:


12

ทางออกที่ดีควรเป็น

chmod -R ug=rwX,o=rX /path

โดยที่เมืองหลวงXหมายถึง: ตั้งบิตรันถ้า

ไฟล์เป็นไดเรกทอรีหรือได้รับอนุญาตจากผู้ใช้บางคนแล้ว

(ยกมาจากchmodหน้าคน)

หรือถ้าคุณต้องการใช้ find

find /path \( -type f -exec chmod ug=rw,o=r   {} + \) -o \
           \( -type d -exec chmod ug=rwx,o=rx {} + \)

ฉันใช้การเปิดกว้างสำหรับทุกคนของคำสั่งนี้สำหรับฮาร์ดไดรฟ์ USB ของฉัน: chmod -v -R ugo = rwX / path ขอบคุณ!
Dude

เห็นได้ชัดว่าไม่มีทางโดยไม่ต้องใช้findเพื่อตั้งค่าการอนุญาตไฟล์ทั้งหมดเป็น 600 และสิทธิ์ไดเรกทอรีทั้งหมดเป็น 700 (ฉันมาที่นี่ผ่าน googlings ของฉันในเรื่อง) ถ้าสามารถทำได้ด้วยchmod -Rคำสั่งเดียวรู้สึกฟรีเพื่อแก้ไข
Wildcard

@ Wildcard: ไม่แน่นอนคำสั่งchmod -R u=rwX,go= /pathทำเกือบสิ่งที่คุณต้องการ: มันตั้งค่า dirs ทั้งหมดเป็น 700 และไฟล์ทั้งหมดเป็น 600 หรือ 700 ขึ้นอยู่กับว่าบิตการประมวลผลถูกตั้งค่าไว้แล้วหรือไม่และฉันคิดว่านี่เป็นสิ่งที่ถูกต้อง .
enzotib

1
@enzotib ใช่ - เกือบ แต่ยังไม่มาก ในกรณีของฉันฉันต้องการปิดการใช้งานบิตการดำเนินการสำหรับไฟล์ทั้งหมด (แต่ไม่ใช่ไดเรกทอรีแน่นอน) โดยไม่คำนึงว่าพวกเขาเป็นสคริปต์หรือไบนารีหรืออะไรก็ตาม ดังนั้นfindคำสั่งที่คุณเขียนมีประโยชน์มากในฐานะแม่แบบ :)
สัญลักษณ์แทน

@Wildcard แล้วจะเอาบิตเรียกใช้ออกก่อนทำซ้ำจากนั้นเพิ่มกลับไปยังไดเรกทอรีที่ใช้คำสั่งด้านบนเท่านั้น
Michael

3

การใช้ find เป็นวิธีที่ 'ถูกต้อง' และเป็นวิธีการเขียนโปรแกรมเพียงอย่างเดียวแม้ว่าจะมีการเปลี่ยนแปลง:

find . -type f -exec chmod ug+rw {} +  # "+" may not be on all systems

หรือ

find . -type f -print0 | xargs -r0 chmod ug+rw  # similar to the -exec + functionality

หรือช้าที่สุด:

find . -type f -exec chmod ug+rw {} \;  # in case xargs is not installed

แต่ละไฟล์เหล่านี้เลือกไฟล์ (ไม่ใช่ไดเร็กทอรีไม่ใช่ symlink) และใช้chmodคำสั่งกับมัน สองครั้งแรกลดจำนวนการโทรไปchmodโดยการต่อท้ายไฟล์ที่ส่วนท้ายของบรรทัดคำสั่งภายในแต่ละครั้งจนกว่าจะถึงจำนวนสูงสุด (มักจะ 10) จากนั้นเรียกคำสั่งและเริ่มสร้างคำสั่งใหม่อีกครั้ง คำสั่งสุดท้ายจะสร้างกระบวนการใหม่สำหรับแต่ละไฟล์ดังนั้นจึงมีประสิทธิภาพน้อยกว่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.