ใช้คำสั่ง chmod อย่างคัดเลือก


11

ฉันต้องการตั้งค่าการอนุญาต 755 ในทุกไฟล์และไดเรกทอรีย่อยภายใต้ไดเรกทอรีเฉพาะ แต่ฉันต้องการรัน chmod 755 เฉพาะสำหรับองค์ประกอบเหล่านั้นซึ่งไม่ได้รับอนุญาต 755

find /main_directory/ -exec chmod 755 {} \;

หากfindคำสั่งส่งคืนรายการแบบยาวสิ่งนี้จะใช้เวลานาน ฉันรู้ว่าฉันสามารถใช้คำสั่ง stat เพื่อตรวจสอบการอนุญาตระดับไฟล์ Octal ของแต่ละองค์ประกอบจากนั้นใช้ if-else เพื่อสลับการอนุญาตไฟล์ แต่มีวิธีการบรรทัดเดียวที่ใช้findและxargsก่อนอื่นตรวจสอบสิทธิ์ไฟล์ / ไดเรกทอรีที่มี แล้วใช้chmodเพื่อเปลี่ยนเป็น 755 หากตั้งค่าเป็นอย่างอื่น


6
นี่อาจเป็นการปรับให้เหมาะสมก่อนเวลาอันควรและอาจไม่สามารถทำได้ถ้าทำได้เร็วขึ้น การตรวจสอบทั้งหมดอาจทำให้ช้าลง การทดสอบเพื่อให้แน่ใจว่ามันเร็วกว่าจะจ่ายเฉพาะถ้าคุณต้องทำสิ่งนี้มาก
ctrl-alt-delor

3
คุณอาจไม่ต้องการให้สิทธิ์ดำเนินการกับไฟล์ทั้งหมด สิ่งนี้จะสร้างความเสี่ยงด้านความปลอดภัย (นี่เป็นหนึ่งในไวรัสพาหะใน Windows ของ Microsoft: ทุกอย่างสามารถทำงานได้) ในโหมดสัญลักษณ์คุณสามารถพูดได้u+rw,go+r,go-w,ugo+X- จดเมืองหลวง
ctrl-alt-delor

ฉันเห็นด้วยกับ @ ctrl-alt-delor แต่จะแนะนำสิ่งที่ใกล้กับสิ่งที่คุณถาม u = rwX, go = rX ซึ่งควรทำสิ่งเดียวกัน
penguin359

คำตอบ:


21

หากคุณต้องการเปลี่ยนการอนุญาตเป็น755ทั้งไฟล์และไดเรกทอรีไม่มีประโยชน์จริง ๆ ในการใช้find(จากจุดประสิทธิภาพการดูอย่างน้อย) และคุณสามารถทำได้

chmod -R 755 /main_directory

หากคุณต้องการใช้findเพื่อหลีกเลี่ยงการเปลี่ยนแปลงการอนุญาตในสิ่งที่มี755สิทธิ์อยู่แล้ว(เพื่อหลีกเลี่ยงการอัพเดตเวลาประทับของเวลา) ดังนั้นคุณควรทดสอบการอนุญาตปัจจุบันสำหรับแต่ละไดเรกทอรีและไฟล์:

find /main_directory ! -perm 0755 -exec chmod 755 {} +

The -exec ... {} +จะรวบรวมชื่อพา ธ มากที่สุดเท่าที่จะเป็นไปได้ซึ่งผ่านการ! -perm 0755ทดสอบและดำเนินการchmodกับพวกมันทั้งหมดในครั้งเดียว

โดยปกติแล้วหนึ่งต้องการเปลี่ยนสิทธิ์ในไฟล์และไดเรกทอรีแยกต่างหากเพื่อให้ไฟล์ไม่ได้ทั้งหมดที่ปฏิบัติการ:

find /main_directory   -type d ! -perm 0755 -exec chmod 755 {} +
find /main_directory ! -type d ! -perm 0644 -exec chmod 644 {} +

ทำงานเหมือนมีเสน่ห์ขอบคุณ ขอแสดงความนับถือ Kumarjit
Kumarjit Ghosh

1
ฉันสงสัยว่าการใช้+แทนที่จะ;สร้างความแตกต่างอย่างมากที่นี่
Kevin

นี่คือวิธีที่รวดเร็ว - หลีกเลี่ยงการตรวจสอบ ฉันจะใช้ find เพื่อสร้างรายการของไฟล์ที่คุณได้รับอนุญาตให้เปลี่ยนเท่านั้นจะหลีกเลี่ยงข้อผิดพลาด chmod ในไฟล์ที่ไม่สามารถเปลี่ยนแปลงได้ <pre> <code> # rwx, rw, wx, w ค้นหาได้เฉพาะ - ผู้ใช้ $ (whoami) -perm / 002! -perm 0755 -exec chmod 0755 {} \; # แบ่งเป็นสองการดำเนินการค้นหา - ผู้ใช้ $ (whoami) -perm / 002! -perm 0755> /tmp/chfiles.txt สำหรับไฟล์ใน $ (</ tmp / chfiles.txt) ทำ chmod --quiet 0755 "$ {file}" เสร็จ </code> </pre>
Chris Reid

@ChrisReid โปรดทราบว่าการวนลูปในรายการชื่อพา ธ เช่นนั้นจะแตกถ้าชื่อพา ธ ใด ๆ มีอักขระช่องว่าง
Kusalananda

ฉันเดาว่าคุณต้องเปลี่ยน Internal Field Separator (IFS) เป็น '\ n' ในสคริปต์ สิ่งเหล่านี้คือการตั้งค่าสภาพแวดล้อมวิธีที่เชลล์ตีความหมายขึ้นอยู่กับค่าของการตั้งค่าเหล่านั้น ฉันทดสอบสคริปต์เกี่ยวกับไฟล์จำลองก่อนที่จะใช้เพื่อกำจัดความผิดพลาดที่รุนแรงเช่นการเปลี่ยนชื่อไฟล์หรือเขียนทับมัน ฉันชอบวิธีที่เชลล์ printf ของการตั้งค่า IFS IFS = $ (printf "\ n") # อ่านง่ายมาก
Chris Reid

1

ตามที่findได้รับ-exec ... +ไวยากรณ์มีจุดไม่มากในการใช้xargsแต่ตามที่คุณขอ:

find /main_directory -not -perm 0755 | xargs chmod 755

1
โปรดทราบด้วยว่า xargs ที่ไม่มี-0(ร่วมกับ-print0in find; ซึ่งเป็นส่วนขยายของ GNU) อาจเป็นปัญหาด้านความปลอดภัยหากผู้โจมตีที่มีศักยภาพสามารถสร้างชื่อไฟล์ที่มีช่องว่างหรืออักขระพิเศษอื่น ๆ ดังนั้นควรยึดติดไว้-execเมื่อคุณทำได้
Matija Nalis

ไม่จำเป็นต้องใช้xargs(แค่ใช้-exec) และถ้าคุณใช้คุณควรใช้-print0/ -0เหมือน Matija พูด
Kevin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.