Как рекурсивно удалить исполняемый бит из файлов (не каталогов)


73

Когда я подключаю USB-флешку (FAT) к компьютеру Mac или Ubuntu, все файлы имеют установленные исполняемые биты. После копирования структуры каталогов на мой жесткий диск, как я могу рекурсивно удалять исполняемые биты только из файлов и сохранять их в каталогах?


Ответы:


133

С 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 *

(Если вы также хотите включить скрытые файлы в основной каталог, вам, вероятно, нужно изменить * на. (Точка), но это не проверено.)


1
В 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 ой! На самом деле это была коробка CentOs, где я установил свой umask на 0007.
Ээро Аалтонен

Это просто грустно ... :( Мне нравится findвариант в ответе ниже, потому что это стиль комбинирования простых инструментов, которые делают One Thing Well.
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-й подход потерпит неудачу для путей, которые содержат пробелы.
МестреЛион

@ephemient: если вы findподдерживаете, -print0я уверен, что он также будет поддерживать-exec
MestreLion

3

Под Linux и Unix в окне терминала или в Mac OS X используйте это в Terminal.app:

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

1
По сути, это ничем не отличается от ответа Маттиса П 2011 года.
slhck

Можете ли вы вспомнить эту командную строку? Я не могу
Майк Л.

См. Комментарий Эфимента под ответом Маттиса, чтобы понять, почему этот ответ полезен.
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 командой try / catch.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.