วิธีลบบิตที่เรียกใช้งานได้ซ้ำจากไฟล์ (ไม่ใช่ไดเรกทอรี)


73

เมื่อฉันเสียบปลั๊ก USB (FAT) ลงในเครื่อง Mac หรือ Ubuntu ของฉันไฟล์ทั้งหมดมีบิตปฏิบัติการที่ตั้งค่าไว้ หลังจากคัดลอกโครงสร้างไดเรกทอรีไปยังฮาร์ดดิสก์แล้วฉันจะลบบิตที่เรียกใช้งานได้ซ้ำจากไฟล์และเก็บไว้ในไดเรกทอรีได้อย่างไร


คำตอบ:


132

ด้วย GNU chmod(บน Ubuntu) ชุดคำสั่งเดี่ยว (เริ่มในไดเรกทอรีปัจจุบัน):

chmod -R -x+X .

คำอธิบาย:

  • -R - ทำงานซ้ำ
  • -x - ลบแฟล็กที่เรียกใช้งานได้สำหรับผู้ใช้ทั้งหมด
  • +X - ตั้งค่าสถานะที่สามารถเรียกใช้งานได้สำหรับผู้ใช้ทั้งหมดหากเป็นไดเรกทอรี

ในกรณีนี้เงินทุนที่ใช้เฉพาะกับไดเรกทอรีเพราะธงปฏิบัติการทั้งหมดถูกลบโดยX -xมิฉะนั้น+Xจะตั้งค่าแฟลกที่สามารถใช้งานได้หากตั้งค่าแฟล็กสำหรับผู้ใช้กลุ่มหรืออื่น ๆ

ด้วย BSD chmod(ซึ่งมีอยู่ใน Mac OS X) คุณจะต้องแยกมันออกเป็นสองคำสั่ง:

sudo chmod -R -x * && sudo chmod -R +X *

(หากคุณต้องการรวมไฟล์ที่ซ่อนอยู่ในไดเรกทอรีหลักด้วยคุณอาจต้องเปลี่ยน * เป็น (จุด) แต่ไม่ได้ทดสอบ)


บน Ubuntu 13.04 จำเป็นต้องปรับแต่งเล็กน้อย:chmod -R a-x+X *
Eero Aaltonen

@EeroAaltonen: ขอบคุณสำหรับการบันทึก สิ่งนี้อาจเกิดขึ้นหากคุณumaskไม่อนุญาตให้xทุกคน คุณใช้ค่าเริ่มต้นumaskหรือเปลี่ยนหรือไม่ คุณช่วยส่งumaskคำสั่งออกมาได้ไหม? นอกจากโซลูชันของคุณยังมีความเป็นไปได้นี้: chmod -R a-x,+X *ซึ่งจะกำหนดxสิทธิ์ตามที่คุณumaskต้องการ ฉันจะอัปเดตคำตอบ แต่ฉันต้องการตรวจสอบพฤติกรรมใน BSD / Mac OS X ก่อน
pabouk

@pabouk oopsie! จริงๆแล้วมันเป็นกล่อง CentOs ที่ฉันตั้ง umask ของฉันเป็น 0007
Eero Aaltonen

นี่เป็นเรื่องน่าเศร้า ... :( ฉันชอบความfindแตกต่างในคำตอบด้านล่างเพราะมันเป็นรูปแบบของการรวมเครื่องมือง่ายๆที่ทำสิ่งหนึ่งสิ่งที่ดี
mikezter

2
ใช้.แทน*หากคุณต้องการใช้สิ่งนี้กับไฟล์ทั้งหมด
John Magnolia

46

หากคุณ cd เข้าสู่เส้นทางที่ถูกต้องก่อน:

find . -type f -exec chmod -x {} \;

หรือ

chmod -x $(find . -type f)

การค้นหาพบไฟล์ทั้งหมดของประเภท 'f' (ซึ่งหมายถึงไฟล์ปกติ) ในพา ธ จากนั้นเรียก chmod -x บนแต่ละไฟล์ {} ได้รับการแทนที่สำหรับชื่อไฟล์และ \; ยุติคำสั่ง chmod


6
หากการfindสนับสนุนของคุณใช้-exec ... \+แทน-exec ... \;- มันจะต้องมีน้อยกว่าfork+ execs find ... -print0 | xargs -0 ...ถ้ามันไม่ได้ใช้
ephemient

5
ผมเคยใช้เทคนิคนี้ แต่มี "ดัด 111" เพิ่มเพื่อหาสิ่งที่เพื่อให้คนที่มัน chmod เท่านั้นที่มีชุด x บิต:find . -type f -perm +111 -exec chmod -x {} \;
chrish

4
+1 @Matthijs เหตุผลที่ทำให้ดีกว่าโซลูชันของ pabouk คือคำสั่งนี้จะแยกไดเรกทอรีเพียงอย่างเดียวขณะที่ pabouk ตั้งค่าบิตที่เรียกใช้งานได้ใหม่ในไดเรกทอรีทั้งหมด อาจมีบางไดเรกทอรีที่ไม่มีบิตที่สามารถเรียกใช้งานได้และคำสั่งของ pabouk จะตั้งค่าไว้ในขณะที่บางคนอาจต้องการทิ้งมันไว้เหมือนเดิม
MariusMatutiae

วิธีที่สองจะล้มเหลวสำหรับเส้นทางที่มีช่องว่าง
MestreLion

@ephemient: หากการfindสนับสนุนของคุณ-print0ฉันค่อนข้างแน่ใจว่ามันจะสนับสนุนด้วย-exec
MestreLion

3

ภายใต้ Linux และ Unix ในหน้าต่างเทอร์มินัลหรือบน Mac OS X ให้ใช้สิ่งนี้ใน Terminal.app:

find . -type f -print0 | xargs -0 chmod -x

1
นี่คือในสาระสำคัญไม่แตกต่างจากคำตอบ Matthijs P จากปี 2011
slhck

คุณจำบรรทัดคำสั่งนี้ได้ไหม ฉันทำไม่ได้
Mike L.

ดูความคิดเห็นของ ephemient ด้านล่างคำตอบของ Matthijs เพื่อดูว่าทำไมคำตอบนี้จึงมีประโยชน์
PatrickT

2

chmod -x+Xวิธีที่ไม่ได้ทำงานสำหรับฉันในอูบุนตูอย่างใดอย่างหนึ่งดังนั้นผมเขียนสคริปต์หลามนี้น้อยที่สุด:

#!/usr/bin/python3
import os
for par, dirs, files in os.walk('.'):
    for d in dirs:
        os.chmod(par + '/' + d, 0o755)
    for f in files:
        os.chmod(par + '/' + f, 0o644)

หากอาจมีสิ่งพิเศษแฟนซีเช่นซ็อกเก็ตในระบบไฟล์ของคุณคุณอาจต้องการล้อมรอบ chmod ล่าสุดด้วยการลอง / จับ

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