chmod แบบเรียกซ้ำ: rw สำหรับไฟล์, rwx สำหรับไดเร็กทอรี


28

ฉันต้องการchmodไฟล์และไดเรกทอรีจำนวนมาก ตามที่xระบุรายการสำหรับไดเรกทอรีและดำเนินการสำหรับไฟล์ปกติที่ฉันต้องการใช้rwสำหรับไฟล์และrwxไดเรกทอรี มันเป็นไปได้โดยใช้chmodคำสั่งเท่านั้น?

หากไม่เป็นเช่นนั้นวิธีที่สะดวกที่สุดคืออะไร

การทำchmod -R 770ไม่ได้เป็นไปได้เพราะฉันไม่ต้องการให้ไฟล์ปกติสามารถใช้งานได้


1
คุณต้องการสิทธิ์การเขียนแบบสาธารณะในไฟล์และไดเรกทอรีหรือไม่ นั่นหมายความว่าคุณไม่สนใจว่าใครเป็นคนปิดบังไฟล์ใด ๆ
Jonathan Leffler

จริง ฉันเปลี่ยนมันด้านบน
ลบ

คำตอบ:


19

ฉันทำสิ่งนี้ในบางโอกาสโดยใช้findคำสั่งเดียว น่าเกลียด แต่มีประสิทธิภาพ

find /p/a/t/h \( -type d -exec chmod 755 {} \; \) -o \( -type f -exec chmod 644 {} \; \)

ไม่จำเป็นต้องอ้าง "{}" ในกรณีที่พา ธ มีช่องว่าง กดไลค์find . -type d -exec chmod -vc 755 "{}" \;(รวมถึง-vcข้อเสนอแนะบางอย่าง) (และอาจจะเพียงเพื่อชี้แจงเพิ่มสองคำสั่งแบบสแตนด์อโลนที่จะตอบได้เป็นอย่างดี?)
Arjan

ไม่ {} ไม่จำเป็นต้องอ้างถึง (ฉันเพิ่งทดสอบเพื่อให้แน่ใจอย่างแน่นอน) เมื่อพบการแทรก {} ลงในคำสั่งจะมีการหลบหนี ฉันไม่ได้ค้นหาผลงานด้านในของการค้นหา แต่ฉันคิดว่ามันจะสร้างอาเรย์อาร์กิวเมนต์เพื่อส่งต่อไปยัง exec () และมันจะ strcpy () ชื่อไฟล์ในอาร์เรย์ เมื่อ chmod ดูที่อาร์กิวเมนต์มันจะปรากฏขึ้นอย่างถูกต้อง
baumgart

37

ใช้การอนุญาต X จาก man page:

บิตเรียกใช้ / ค้นหาหากไฟล์เป็นไดเรกทอรีหรือบิตเรียกใช้ / ค้นหาใด ๆ ตั้งอยู่ในโหมดดั้งเดิม (ไม่ได้แก้ไข) การดำเนินการกับสัญลักษณ์ดัด "X" มีความหมายเฉพาะเมื่อใช้ร่วมกับสัญลักษณ์ op "+" และจะถูกละเว้นในกรณีอื่นทั้งหมด

ดังนั้นทำดังต่อไปนี้:

chmod -R a-x [directory]
chmod -R a+rwX [directory]

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


1
สิ่งนี้จะไม่บังคับโหมด 666 ในไฟล์ปกติ ไม่ได้ล้างบิตเรียกทำงานสำหรับไฟล์ปกติหากตั้งไว้แล้ว
ต้มตุ๋น Quixote

ดังนั้นในกรณีที่คุณสามารถทำchmod -R a-x [directory]ตามด้วยchmod -R a+rwX [directory]?
jwaddell

@ jwaddel: มันควรจะทำงาน คุณกำลังเอารันบิตโดยไม่คำนึงถึงของไฟล์ / ประเภทไดเรกทอรีแล้วเพิ่มการดำเนินการไปยังไดเรกทอรีเท่านั้นและไฟล์ปกติที่มีอยู่แล้วบิตดำเนินการเกี่ยวกับ (ซึ่งขณะนี้ไม่มี.)
เบน S

เมื่อฉันทำa-xแล้วไดเรกทอรีจะไม่สามารถเข้าถึงได้ ในความเป็นจริง chmod ล้มเหลวด้วยการปฏิเสธสิทธิ์และจะไม่ลบบิตปฏิบัติการจากไฟล์ภายในไดเรกทอรี มีวิธีทำโดยไม่ต้องรูตหรือไม่?
avakar

14

คุณยังสามารถใช้findพร้อมกับxargs:

find . -type f -print0 | xargs -0 chmod 666
find . -type d -print0 | xargs -0 chmod 777

โดยที่-typeระบุไดเรกทอรีdหรือf ile


1
xargs ไม่มีข้อจำกัดความยาวหรือไม่ มันเป็นไฟล์และไดเรกทอรีจำนวนมาก
ลบ

2
ฉันจะทำไดเรกทอรีก่อนแล้วจึงไฟล์ มิฉะนั้นคุณอาจเสี่ยงที่จะพลาดทรีย่อยเนื่องจากขาดการอนุญาต นอกจากนี้คุณควรตรวจสอบว่ารายการนั้นถูกสอดแนมก่อนหรือหลัง chmod หรือไม่เช่นเดียวกับด้านบน และใช่ฉันจะละเว้นจากการใช้ xargs
Stefano Borini

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