73

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

4 ответа4

130

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

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

44

Если вы сначала перейдете на правильный путь:

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

или же

chmod -x $(find . -type f)

Поиск находит все файлы типа 'f' (что означает обычный файл) в пути. и затем вызывает chmod -x для каждого файла. {} Подставляется вместо имени файла и \; завершает команду chmod.

3

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

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

Путь chmod -x+X у меня тоже не сработал в ubuntu, поэтому я написал этот минимальный скрипт на python:

#!/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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .