سؤال كيفية إزالة بت الملف التنفيذي بشكل متكرر من الملفات (لا الدلائل)


عندما أقوم بتوصيل عصا USB (FAT) بجهاز Mac أو Ubuntu ، فإن جميع الملفات بها مجموعة بت قابلة للتنفيذ. بعد نسخ بنية الدليل إلى القرص الثابت الخاص بي ، كيف أقوم بإزالة البتات القابلة للتنفيذ من الملفات فقط واحتفظ بها في الدلائل؟


71
2018-01-18 09:15


الأصل


ممكن من الازدواجية كيفية chmod كافة الدلائل باستثناء الملفات (بشكل متكرر)؟ - G-Man


الأجوبة:


مع جنو 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 *

(إذا كنت تريد تضمين الملفات المخفية في الدليل الرئيسي أيضًا ، فمن المحتمل أن تحتاج إلى تغيير * إلى. (نقطة) ، ولكن لم يتم اختبارها.)


127
2018-06-08 19:32



في 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
استعمال . بدلا من * إذا كنت تريد تطبيق هذا على جميع الملفات - John Magnolia


إذا قمت بالضغط على المسار الصحيح أولاً:

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

أو

chmod -x $(find . -type f)

يجد الاكتشاف جميع الملفات من النوع "f" (وهو ما يعني الملف العادي) في المسار. ثم يدعو chmod -x على كل ملف. يتم استبدال {} اسم الملف و \؛ ينهي الأمر chmod.


43
2018-01-18 09:33



إذا كان لديك find يدعم ذلك ، استخدم -exec ... \+ بدلا من -exec ... \; - سوف يتطلب أقل fork+execالصورة. إذا لم يحدث ذلك ، استخدم find ... -print0 | xargs -0 .... - ephemient
لقد استعملت هذه التقنية ، ولكن مع "-perm +111" تضاف إلى الاكتشاف لذا فإن تلك هي فقط أجهزة chmod التي تحتوي على مجموعة x-bit: find . -type f -perm +111 -exec chmod -x {} \; - chrish
+1Matthijs السبب في أن هذا أفضل من حل pabouk هو أن هذا الأمر يترك الدلائل بمفردها ، في حين يعيد pabouk إعادة تعيين البت التنفيذي في كافة الدلائل. قد تكون هناك بعض الأدلة التي لم يتم تعيين البت التنفيذي عليها ، ويضعها أمر pabouk ، بينما قد يرغب المرء في تركها كما هي. - MariusMatutiae
يفشل الأسلوب الثاني للمسارات التي تحتوي على مسافات. - MestreLion
ephemient: إذا كان لديك find الدعم -print0 أنا متأكد من أنها سوف تدعم أيضا -exec - MestreLion


تحت Linux و Unix في نافذة طرفية أو في Mac OS X ، استخدم هذا في Terminal.app:

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

3
2018-05-28 11:12



هذا ، في جوهره ، لا يختلف عن إجابة Matthijs P من عام 2011. - slhck
يمكنك تذكر هذا سطر الأوامر؟ لا استطيع - Mike L.
انظر تعليق الخلاصة أسفل الإجابة Matthijs لمعرفة لماذا هذا الجواب مفيد. - PatrickT


ال 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 الماضي مع محاولة / التقاط.


2
2018-03-26 04:33