วิธีการลบการเรียกใช้งานจากไฟล์ซ้ำโดยไม่ต้องแตะโฟลเดอร์ซ้ำ ๆ


40

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

ปัญหาหนึ่งก็คือไฟล์ข้อความทั้งหมดของฉันได้รับสิทธิในการเรียกใช้งานซึ่งผิดปกติ ดังนั้นฉันจึงพยายาม:

sudo chmod -R a-x folder\ with\ restored\ backup/

แต่มันผิดเพราะลบการxอนุญาตจากไดเรกทอรีเช่นกันซึ่งทำให้ไม่สามารถอ่านได้

คำสั่งที่ถูกต้องในกรณีนี้คืออะไร?


1
Meta: ฉันไม่เคยเข้าใจว่าทำไมระบบ Unix จึงเพิ่มบิตรันไทม์ลงในไฟล์ที่ติดตั้งจากระบบไฟล์ DOS หรือ Windows มันไม่เหมือนใครที่เคยใช้งานไฟล์เหล่านั้น ฉันมักจะเพิ่ม "noexec" ให้กับตัวเลือกเมานท์ของฉันทุกที่ที่ใช้งานได้จริง
Edward Falk

คำตอบ:


68
chmod -R -x+X *

-xลบผู้สิทธิ์สำหรับทุกจะเพิ่มผู้สิทธิ์ทั้งหมด แต่เพียงไดเรกทอรี
+X


2
ในที่สุดคำสั่งที่ฉันใช้ในการคืนค่าสิทธิ์เป็นปกติ: `chmod -R a-x + X, u-x + rwX, go-wx + rX ไดเรกทอรี / ชื่อ`
gaazkam

3
ดูคำตอบของเอ็ดเวิร์ดเกี่ยวกับข้อยกเว้นสำหรับ BSD
fikr4n

4
สิ่งนี้ล้มเหลวข้อกำหนด "ไม่ต้องแตะโฟลเดอร์" จะเป็นอย่างไรถ้าเอ็กซีคิวต์ (อาจจะเป็นโลก) ได้ถูกลบออกไปในบางไดเรกทอรี คุณไม่ควรเพิ่มมัน
Ben Voigt

4
สิ่งนี้ไม่ทำงานบน Mac การย้ายแฟล็ก -R ไปยังจุดเริ่มต้นจะทำให้การทำงานนี้ในทั้งลินุกซ์และเทอร์มินัล Mac chmod -R -x+x *
JoeMoe1984

2
จริง ๆ แล้วด้วยลำดับที่ถูกต้องมันจะทำงานบน OSX แต่จริง ๆ แล้วมันไม่มีผลที่ต้องการ คุณต้องทำมันเป็นสองขั้นตอนแยก:chmod -R -x * && chmod -R +X *
Timmmm

14

ตกลงฉันอ่านหน้าคู่มือ "chmod" อีกครั้งสำหรับ Mac OS X, BSD และ Linux และทำการทดลองสองสามครั้ง นี่คือสิ่งที่ฉันเรียนรู้เกี่ยวกับโหมดสัญลักษณ์ มันอาจซับซ้อน แต่ก็คุ้มค่าที่จะเข้าใจ:

  • รูปแบบทั่วไปคือข้อ [, ข้อ …] โดยที่:
  • ข้อ : = [ugoa] [+ - =] [rwxXstugo]
  • [ugoa] ( ใคร ) (ระบุหลายรายการ) หมายถึงตั้งค่าการอนุญาตสำหรับผู้ใช้กลุ่มอื่น ๆ หรือทั้งหมด หากไม่ได้ระบุไว้ค่าเริ่มต้นคือ 'a' แต่umaskจะมีผล
  • [+ - =] ( การกระทำ ) (ระบุหนึ่งรายการ) หมายถึง:
    • + หมายถึงเพิ่มการอนุญาตที่ระบุให้กับการอนุญาตที่มีผลอยู่แล้ว
    • - หมายถึงลบสิทธิ์ที่ระบุออกจากการอนุญาตที่มีผลอยู่แล้ว
    • = หมายถึงตั้งค่าการอนุญาตเป็นสิทธิ์ที่ระบุล้างคนอื่น ๆ ทั้งหมด
  • [rwxXstugo] (การอนุญาต ) (ระบุหลาย ๆ rwxXst หรือหนึ่งใน ugo) ตั้งค่าการอนุญาตสำหรับผู้ใช้ที่ระบุดังนี้:
    • r - อ่าน
    • w - เขียน
    • x - ดำเนินการ / ค้นหา
    • X - รัน / ค้นหาไดเร็กทอรี iff หรือรันไทม์บิตใด ๆ ได้ถูกตั้งค่าแล้ว
    • s - suid หรือ sgid
    • เหนียว -
    • u - คัดลอกสิทธิ์ของผู้ใช้
    • g - คัดลอกการอนุญาตของกลุ่ม
    • o - คัดลอกการอนุญาตอื่น ๆ

ตัวอย่างเช่นa+xจะทำให้ทุกคนสามารถเรียกใช้ไฟล์ได้ a+Xจะทำให้ทุกคนเป็นไฟล์ที่สามารถเรียกใช้งานได้ถ้าทุกคนสามารถกระทำได้

a+xจะทำให้ทุกคนค้นหาไดเรกทอรีได้ a+Xจะทำให้ทุกคนค้นหาไดเรกทอรีได้

ความแตกต่างที่สำคัญระหว่าง BSD และ Linux คือด้วย BSD การกำหนดจะขึ้นอยู่กับการอนุญาตของไฟล์ก่อนที่จะดำเนินการ chmod ในขณะที่ใช้ Linux การกำหนดจะดำเนินการทันทีก่อนที่จะเรียกใช้งานข้อ + X

ดังนั้นด้วย BSD ชุดค่าผสมa-x,a+Xจะลบสิทธิ์การเรียกใช้งาน / ค้นหาจากนั้นสร้างไดเรกทอรีที่ทุกคนสามารถค้นหาได้และสร้างไฟล์ที่ทุกคนสามารถเรียกใช้งานได้ถ้าใคร ๆ

ด้วย Linux a-x,a+Xจะลบการอนุญาตให้เรียกใช้งาน / ค้นหาแล้วทำให้ทุกคนสามารถค้นหาไดเรกทอรีได้ในขณะที่ไม่มีใครสามารถเรียกใช้ไฟล์ได้


นี่คือตัวอย่างที่เป็นรูปธรรม: บนเครื่อง BSD: ไดเรกทอรีไฟล์ที่เรียกใช้งานได้และไฟล์ที่ไม่สามารถเรียกใช้งานได้:

drwxr-x---  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x---  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

สังเกตว่าทั้งไดเรกทอรีและ "fie" นั้นสามารถเรียกใช้ / ค้นหาได้โดยผู้ใช้ แต่ไม่ใช่ผู้อื่น

chmod a-x,a+X *ตอนนี้เราดำเนินการ ส่วนคำสั่งแรกจะตัดบิตเรียกใช้งาน / ค้นหาจากผู้ใช้ทั้งหมดสำหรับไฟล์ทั้งหมด แต่ส่วนคำสั่งที่สองจะเพิ่มกลับคืนมาสำหรับ "ค่าธรรมเนียม" และ "fie" "ค่าธรรมเนียม" เพราะเป็นไดเรกทอรีและ "เหม่" เพราะมีบิตที่สามารถเรียกใช้งานได้อย่างน้อยหนึ่งรายการเพื่อเริ่มต้นด้วย

drwxr-x--x  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x--x  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

ฉันมีผลการดำเนินการchmod -x+Xเดียวกัน

สรุป: โซลูชันของ Jak Gibb จะทำงานบน Linux แต่สำหรับ BSD คุณจะต้องทำการผ่านสองครั้ง

ฉันไม่ได้ทดสอบสิ่งนี้กับ SVr4 หรือตัวแปร Unix อื่น ๆ


อ่านดี ขอบคุณสำหรับการทำวิจัยในเรื่องนี้
Jak Gibb

10

วิธีหนึ่งในการทำ:

find backup -type f -exec chmod 0644 {} +

6
สิ่งนี้อาจปิดท้ายการเพิ่มหรือลบสิทธิ์ที่คุณไม่ต้องการเปลี่ยนแปลง ดีกว่าที่จะใช้chmod a-x {}
Edward Falk

1
@EdwardFalk chmod a-x {}ยังสามารถลบสิทธิ์ที่คุณไม่ต้องการเปลี่ยนแปลงและมันสามารถทำให้ไฟล์เขียนได้ทั่วโลก ประเด็นคือ 0644 เป็นการประนีประนอม "โดยทั่วไป" แน่นอนว่า OP ควรมีส่วนร่วมในสมองก่อนที่จะใช้วิธีแก้ไขปัญหาจากอินเทอร์เน็ตบนคอมพิวเตอร์ของเขา
Satō Katsura

4
"axe" จะลบการอนุญาตให้ใช้สำหรับผู้ใช้กลุ่มอื่นและทำให้สิทธิ์อื่น ๆ ไม่เปลี่ยนแปลงเท่าที่ฉันรู้ ฉันมีสิ่งผิดปกติหรือไม่
Edward Falk

1
@EdwardFalk ไม่คุณพูดถูก แต่คุณไม่ทราบว่าชุดของไฟล์คืออะไรและคุณไม่ทราบว่าการอนุญาตก่อนหน้าchmodนี้คืออะไร หากไฟล์สำรองมีสคริปต์และไบนารีการลบออกxจากไฟล์นั้นจะไม่ถูกต้อง หากการอนุญาตก่อนหน้าchmodนี้เป็น 0777 สิทธิ์นั้นchmod a-xจะยังคงอยู่ 0666 ซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ สิ่งที่ฉันพูดคือการchmod 0644วิเคราะห์พฤติกรรมที่ดีกว่าไม่ใช่chmod a-xเรื่องผิด
Satō Katsura

1
@NajibIdrissi ยกเว้นเมื่อคุณรู้ว่าพวกเขาเปลี่ยนเป็น 0777 เมื่อคุณคัดลอกไว้ในระบบไฟล์ต่างประเทศที่ไม่มีสิทธิ์ UNIX ซึ่งเป็นสิ่งที่ OP ทำ
Satō Katsura

6
 find backup ! -type l ! -type d -exec chmod a-x {} +

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

โปรดทราบว่า:

 find backup -type f -exec chmod a-x {} +

จะเปลี่ยนการอนุญาตของไฟล์ปกติเท่านั้น ที่จะไม่รวมไดเรกทอรีและsymlinksแต่ยังอุปกรณ์ , ชื่อ pipes , ซ็อกเก็ตและอื่น ๆ อาจจะขึ้นอยู่กับระบบ ( แต่ในกรณีของ OP ของการสำรองข้อมูลของระบบแฟ้ม NTFS เหล่านั้นจะไม่น่าจะเป็นปัจจุบัน)


2

ใน zsh ใช้ตัวระบุglob .เพื่อจับคู่ไฟล์ปกติเท่านั้น (ไม่รวมลิงก์สัญลักษณ์) และDเพื่อจับคู่ไฟล์ dot:

sudo chmod a-x folder\ with\ restored\ backup/**/*(D.)

หากบรรทัดคำสั่งยาวเกินไปคุณสามารถใช้zargs:

zargs -- folder\ with\ restored\ backup/**/*(D.) -- sudo chmod a-x 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.