วิธีเปลี่ยนการอนุญาตไฟล์สำหรับไดเรกทอรีในคำสั่งเดียว


11

ฉันจะเปลี่ยนการอนุญาตไฟล์ทั้งหมดของไดเรกทอรีในคำสั่งเดียวใน Unix ได้อย่างไร


คุณหมายถึงคุณต้องการเปลี่ยนการอนุญาตสำหรับไฟล์ทั้งหมดในไดเรกทอรีหรือไม่? คุณต้องการให้สิ่งนี้เข้าไปในไดเร็กทอรีที่ซ้อนกันหรือไม่? คุณต้องการเปลี่ยนการอนุญาตของไดเรกทอรี (ตัวเอง) หรือเพียงแค่ไฟล์ภายใน? ท้ายสุดคุณลองค้นหาเว็บไซต์นี้ก่อนโพสต์คำถามของคุณหรือไม่
อีเธอร์

คำตอบ:


21

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

chmod +x dir  # Set a directory to be listable
chmod +x file # Set a file to be executable

ในการเปลี่ยนเจ้าของไฟล์ / ไดเรกทอรีซ้ำ (ส่งผลกระทบต่อผู้สืบทอดทั้งหมด):

chown -R username           dir # Recursively set user
chown -R username:groupname dir # Recursively set user and group

ในการเปลี่ยนสิทธิ์บิตของไฟล์ทั้งหมดในไดเรกทอรีให้ทำซ้ำ:

find dir -type f -exec chmod 644 {} ';' # make all files       rw-r-r-

ในการเปลี่ยนบิตสิทธิ์ของไดเรกทอรีทั้งหมด:

find dir -type d -exec chmod 755 {} ';' # make all directories rwxr-xr-x

มันคงจะดีถ้าคุณทำได้:

chmod -R 755 dir

อย่างไรก็ตามสิ่งนี้มีปัญหา มันถือว่าไฟล์และไดเรกทอรีเดียวกัน คำสั่งด้านบนทำให้ไดเรกทอรีสามารถฟังได้และอ่านได้โดยผู้ใช้ทุกคน แต่มันก็ทำให้ทุกไฟล์ปฏิบัติการซึ่งโดยปกติจะเป็นสิ่งที่คุณไม่ต้องการทำ

หากเราเปลี่ยนเป็น644เราจะพบปัญหาอื่น:

$ chmod -R 644 x2
chmod: cannot access `x2/authors.html': Permission denied
chmod: cannot access `x2/day_of_week.plot': Permission denied
chmod: cannot access `x2/day_of_week.dat': Permission denied
chmod: cannot access `x2/commits_by_year.png': Permission denied
chmod: cannot access `x2/index.html': Permission denied
chmod: cannot access `x2/commits_by_year.plot': Permission denied
chmod: cannot access `x2/commits_by_year_month.plot': Permission denied
chmod: cannot access `x2/files_by_date.png': Permission denied
chmod: cannot access `x2/files.html': Permission denied
...

ปัญหาคือการ644ดึงบิตรายการไดเรกทอรีออกและผลข้างเคียงนี้จะป้องกันการข้ามผ่านของทรีไฟล์ คุณสามารถแก้ไขปัญหานี้ได้โดยใช้sudoแต่คุณยังคงจบลงด้วยไดเรกทอรีที่ไร้ประโยชน์อย่างสมบูรณ์สำหรับผู้ใช้ที่ไม่ใช่รูท

ประเด็นคือใช้chmod -Rงานได้ดีในบางกรณี (เช่นchmod -R g-r) แต่ไม่ใช่ในกรณีที่คุณต้องการยุ่งกับ-xบิตเนื่องจากทำงานกับไฟล์และไดเรกทอรีโดยไม่เลือกปฏิบัติ


ทำไมคุณคิดว่าเขาต้องการตั้งค่า644หรือว่าเขาตั้งค่า-xในไดเรกทอรีที่ทั้งหมดหรือไม่ คำถามกำหนดเพียงว่าเขาต้องการเปลี่ยนสิทธิ์ไม่ใช่สิ่งที่เฉพาะเจาะจง
Reese Moore

@ Reese Moore: ถูกต้อง ผู้ถามไม่ได้พูดอะไรเกี่ยวกับการเปลี่ยนการอนุญาตซ้ำ
Joey Adams

1
โดยทั่วไปคุณต้องการใช้สิ่งที่เป็นสัญลักษณ์ + และ - สำหรับสิ่งนั้น เช่น,chmod -R go=u,go-w /dir
dannysauer

6

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

คุณสามารถใช้ตัวพิมพ์ใหญ่ 'X' เพื่อทำสิ่งที่ถูกต้องสำหรับโฟลเดอร์: 'X' = "ดำเนินการ / ค้นหาเฉพาะในกรณีที่ไฟล์เป็นไดเรกทอรีหรือได้รับอนุญาตจากผู้ใช้แล้ว"

ดังนั้นเช่น: chmod -R ug = rwX, o-rwx

จะทำให้ทั้งต้นไม้สามารถเข้าถึงได้โดยเจ้าของและกลุ่มของแต่ละไฟล์และไม่สามารถเข้าถึงได้โดยบุคคลอื่น ไฟล์ที่ปฏิบัติการได้ใด ๆ จะยังคงสามารถเรียกใช้งานได้ในภายหลังและไดเรกทอรีทั้งหมดจะมี 'x' สำหรับผู้ใช้และกลุ่มและไม่ใช่สำหรับผู้อื่น


ลองchmod -R 444 somedirในไดเรกทอรีที่มีไฟล์อยู่ในนั้น คุณได้รับPermission deniedเนื่องจากแฟล็ก -x กำลังถูกลบออกจากไดเร็กทอรีและจำเป็นต้องอ่านไดเร็กทอรีต่อไป
Joey Adams

1
ภาคผนวกที่มีประโยชน์สำหรับสิ่งนี้คือไวยากรณ์ X = Y ตัวอย่างเช่นคุณสามารถตั้งค่าการอนุญาตให้กลุ่มเป็นสิทธิ์ผู้ใช้โดยใช้ chmod -R g = u dir เพื่อตั้งค่ากลุ่มและผู้ใช้ที่เทียบเท่า สิ่งนี้สามารถแก้ไขสิ่งต่าง ๆ เช่น dirs ที่ต้องการปฏิบัติการได้ในขณะที่ไฟล์ "plain" ไม่ทำงาน
Paul Rubel

3
chmod -R <file permission> *

จากหน้าคนของchmod:

-R, --recursive
              change files and directories recursively

ใช้chmodกับ-Rสวิตช์สำหรับหลายทิศทางซึ่งมีแผนผังย่อยไดเรกทอรีที่มีไฟล์หลายล้านไฟล์อยู่ภายในและคุณต้องการเปลี่ยนการอนุญาตไฟล์ของไฟล์เหล่านี้เข้าด้วยกันในครั้งเดียว

การอนุญาตให้ใช้ไฟล์อาจมีไว้สำหรับเช่น 777, 755, 644 เป็นต้น

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