Chmod ซ้ำ


249

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

ฉันได้ดูในหัวข้อนี้: chmod: วิธีการเพิ่มสิทธิ์ดำเนินการซ้ำเฉพาะไฟล์ที่มีสิทธิ์ดำเนินการแล้วเป็นบางคนอื่น ๆ แต่ไม่มีความสุข

ไดเรกทอรีมาพร้อมกับหลาย ๆ แต่ผิดธงทั้งหมดอาจปรากฏเป็น:

drwx------
d---r-x---
drwxrwxr-x
dr--r-xr--

นี่เป็นเพียงส่วนน้อยที่ฉันค้นพบ แต่อาจมากกว่านี้

findข้อผิดพลาดเมื่อพยายามที่จะมองเข้าไปในไดเรกทอรีที่ไม่มีได้รับอนุญาตและไม่ได้ผ่านไปx chmodสิ่งที่ฉันได้ทำไปแล้วคือการเปลี่ยนการอนุญาตในไดเรกทอรีหลักด้วยตนเองจากนั้นไปที่ไดเรกทอรีย่อยและทำเช่นเดียวกันสำหรับพวกเขาและอื่น ๆ แต่นี่เป็นแรงงานมือจำนวนมาก มีวิธีการทำสิ่งนี้โดยอัตโนมัติหรือไม่?

นั่นเป็นวิธีที่ฉันทำตอนนี้:

ทำ:

$ chmod -R +x
$ chmod -R +r

จนกว่าฉันจะไม่ได้รับข้อผิดพลาดแล้ว

$ find -type f -exec chmod -x {} +

แต่ต้องมีวิธีที่ดีกว่า


3
-r ไม่เหมือนกับ -R
PJ Brunet

อื่น ๆ ทราบถ้าคุณต้องการพูดว่าให้สิทธิ์กลุ่มทั้งหมดตรงกับสิทธิ์ของเจ้าของ (ดูเหมือนจะมีโอกาสน้อยที่จะดึงทุกอย่างขึ้น IMO) นั่นเป็นไปได้ทั้งหมดที่serverfault.com/a/284478/210994
ThorSummoner

คำตอบ:


131

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

find . -type d -exec chmod +rx {} \;

2
อะไรคือความแตกต่างระหว่าง '\;' และ '+' ที่ใช้โดย OP เมื่อสิ้นสุดคำสั่ง?
kon Psych

1
@konpsych เห็นได้ชัดว่า+สร้างบรรทัดคำสั่งในวิธีที่แตกต่าง ฉันไม่รู้จริง ๆ \;เป็นวิธีปกติโดยมีหนึ่งคำสั่งต่อไฟล์ที่ตรงกับการค้นหา
Fred Foo

ไม่ทำงานหากไฟล์บางไฟล์มีช่องว่างในชื่อ
เร็ว ๆ นี้

3
@Soonts แล้ว"{}"แทน{}ควรจะแก้ไขมัน
user4642212

ฉันวิ่งสิ่งนี้ภายใต้ระบบย่อย linux บน Windows 10 และมันมีผลตรงกันข้าม การอนุญาตให้ใช้ไฟล์ส่วนใหญ่ถูกลบ
Max Candocia

176

คุณสามารถใช้ chmod ด้วยXตัวอักษรโหมด (ตัวพิมพ์ใหญ่ X) เพื่อตั้งค่าแฟล็กที่สามารถเรียกทำงานได้สำหรับไดเร็กทอรีเท่านั้น

ในตัวอย่างด้านล่างแฟล็กที่เรียกทำงานได้จะถูกเคลียร์จากนั้นตั้งค่าสำหรับไดเร็กทอรีทั้งหมดแบบเรียกซ้ำ:

~$ mkdir foo
~$ mkdir foo/bar
~$ mkdir foo/baz
~$ touch foo/x
~$ touch foo/y

~$ chmod -R go-X foo 
~$ ls -l foo
total 8
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 bar
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y

~$ chmod -R go+X foo 
~$ ls -l foo
total 8
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 bar
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y

การอธิบายเล็กน้อย:

  • chmod -x foo- ล้างค่าสถานะeXecutableสำหรับfoo
  • chmod +x foo- ตั้งค่าสถานะeXecutableสำหรับfoo
  • chmod go+x foo- เหมือนด้านบน แต่ตั้งค่าสถานะสำหรับผู้ใช้กลุ่มและผู้ใช้รายอื่นเท่านั้นอย่าแตะผู้ใช้ (เจ้าของ)
  • chmod go+X foo - เหมือนข้างบน แต่ใช้เฉพาะกับไดเรกทอรีเท่านั้นอย่าแตะไฟล์
  • chmod -R go+X foo- เหมือนข้างบน แต่ทำสิ่งนี้ซ้ำสำหรับไดเรกทอรีย่อยทั้งหมดของfoo

80

ลองเปลี่ยนการพากย์ทั้งหมดในเวลาเดียวกัน:

chmod -R +xr

ที่จะนำสิทธิ์ดำเนินการในทุกไดเรกทอรีที่ไม่ใช่เช่นกัน
Fred Foo

1
ใช่. ขั้นตอนนี้จะแทนที่ขั้นตอนที่วนซ้ำครั้งแรก คุณต้องวิ่งfind -type f -exec chmod -x {} +ต่อไป
choroba

50

ในการทำให้ทุกอย่างสามารถเขียนได้โดยเจ้าของอ่าน / ดำเนินการโดยกลุ่มและปฏิบัติการระดับโลก:

chmod -R 0755

วิธีทำให้ทุกอย่างเปิดกว้าง:

chmod -R 0777

12
เพิ่มตำแหน่งโฟลเดอร์ปัจจุบัน:chmod -R 0777 .
Danijel

18

การเพิ่มการอนุญาตให้เรียกใช้ซ้ำให้กับไฟล์ทั้งหมด (ไม่ใช่โฟลเดอร์) ภายในโฟลเดอร์ปัจจุบันที่มีshนามสกุล:

find . -name '*.sh' -type f | xargs chmod +x

* สังเกตท่อ ( |)


2

ให้ 0777 กับไฟล์และไดเรกทอรีทั้งหมดที่เริ่มต้นจากเส้นทางปัจจุบัน:

chmod -R 0777 ./

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