Як видалити виконуваний біт рекурсивно з файлів (а не каталогів)


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 я поставив свій умаск на 0007.
Ееро Аалтонен

Це просто сумно ... :( Мені подобається findваріант у відповідь нижче для його стилю поєднання простих інструментів , які роблять одну річ добре.
mikezter

2
Використовуйте .замість цього, *якщо ви хочете, щоб це було застосовано до всіх файлів
Джон Магнолія

46

Якщо ви вперше вкажете правильний шлях:

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 ....
ефемія

5
Я використовував цю техніку, але з "-perm +111" додано до знаходження, тому це лише chmod, у яких встановлено x-біт:find . -type f -perm +111 -exec chmod -x {} \;
chrish

4
+1 @Matthijs Причина, чому це краще, ніж рішення pabouk, полягає в тому, що ця команда залишає каталоги в спокої, тоді як pabouk повторно встановлює біт виконуваного файлу у всіх каталогах. Можливо, є деякі каталоги, у яких виконуваний біт не встановлений, а команда pabouk встановлює його, хоча можна було б залишити їх такими, якими вони є.
MariusMatutiae

2-й підхід не вдасться для шляхів, що містять пробіли.
MestreLion

@ephemient: якщо ваші findпідтримки, -print0я впевнений, що вони також підтримуватимуть-exec
MestreLion

3

Під Linux і Unix у вікні терміналу або на Mac OS X використовуйте це в Terminal.app:

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

1
Це, по суті, не відрізняється від відповіді
Маттійса

Чи можете ви пригадати цей командний рядок? Я не можу.
Майк Л.

Дивіться коментар ефефеєнта нижче відповіді Маттійса, щоб дізнатися, чому ця відповідь корисна.
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 за допомогою спробувати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.