เมื่อฉันเสียบปลั๊ก USB (FAT) ลงในเครื่อง Mac หรือ Ubuntu ของฉันไฟล์ทั้งหมดมีบิตปฏิบัติการที่ตั้งค่าไว้ หลังจากคัดลอกโครงสร้างไดเรกทอรีไปยังฮาร์ดดิสก์แล้วฉันจะลบบิตที่เรียกใช้งานได้ซ้ำจากไฟล์และเก็บไว้ในไดเรกทอรีได้อย่างไร
เมื่อฉันเสียบปลั๊ก USB (FAT) ลงในเครื่อง Mac หรือ Ubuntu ของฉันไฟล์ทั้งหมดมีบิตปฏิบัติการที่ตั้งค่าไว้ หลังจากคัดลอกโครงสร้างไดเรกทอรีไปยังฮาร์ดดิสก์แล้วฉันจะลบบิตที่เรียกใช้งานได้ซ้ำจากไฟล์และเก็บไว้ในไดเรกทอรีได้อย่างไร
คำตอบ:
ด้วย 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 *
(หากคุณต้องการรวมไฟล์ที่ซ่อนอยู่ในไดเรกทอรีหลักด้วยคุณอาจต้องเปลี่ยน * เป็น (จุด) แต่ไม่ได้ทดสอบ)
chmod -R a-x+X *
umask
ไม่อนุญาตให้x
ทุกคน คุณใช้ค่าเริ่มต้นumask
หรือเปลี่ยนหรือไม่ คุณช่วยส่งumask
คำสั่งออกมาได้ไหม? นอกจากโซลูชันของคุณยังมีความเป็นไปได้นี้: chmod -R a-x,+X *
ซึ่งจะกำหนดx
สิทธิ์ตามที่คุณumask
ต้องการ ฉันจะอัปเดตคำตอบ แต่ฉันต้องการตรวจสอบพฤติกรรมใน BSD / Mac OS X ก่อน
find
แตกต่างในคำตอบด้านล่างเพราะมันเป็นรูปแบบของการรวมเครื่องมือง่ายๆที่ทำสิ่งหนึ่งสิ่งที่ดี
.
แทน*
หากคุณต้องการใช้สิ่งนี้กับไฟล์ทั้งหมด
หากคุณ cd เข้าสู่เส้นทางที่ถูกต้องก่อน:
find . -type f -exec chmod -x {} \;
หรือ
chmod -x $(find . -type f)
การค้นหาพบไฟล์ทั้งหมดของประเภท 'f' (ซึ่งหมายถึงไฟล์ปกติ) ในพา ธ จากนั้นเรียก chmod -x บนแต่ละไฟล์ {} ได้รับการแทนที่สำหรับชื่อไฟล์และ \; ยุติคำสั่ง chmod
find
สนับสนุนของคุณใช้-exec ... \+
แทน-exec ... \;
- มันจะต้องมีน้อยกว่าfork
+ exec
s find ... -print0 | xargs -0 ...
ถ้ามันไม่ได้ใช้
find . -type f -perm +111 -exec chmod -x {} \;
find
สนับสนุนของคุณ-print0
ฉันค่อนข้างแน่ใจว่ามันจะสนับสนุนด้วย-exec
ภายใต้ Linux และ Unix ในหน้าต่างเทอร์มินัลหรือบน Mac OS X ให้ใช้สิ่งนี้ใน Terminal.app:
find . -type f -print0 | xargs -0 chmod -x
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 ล่าสุดด้วยการลอง / จับ