Как использовать chmod -R ug+X только для каталогов

Вопрос или проблема

Как я могу рекурсивно выполнить chmod, чтобы установить исполняемые права только для каталогов?

Я ошибочно думал, что chmod +X устанавливает исполняемые права только для каталогов, но, как указано в мануале

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

он также устанавливает исполняемые права для файлов, если установлен любой из битов исполняемости, как показано ниже

# mkdir directory
# touch file
# chmod 654 directory file 
# ls -ld directory file
drw-r-xr--. 2 user group 4096 Nov 26 09:50 directory
-rw-r-xr--. 1 user group    0 Nov 26 09:50 file
# chmod a+X directory file
# ls -ld directory file
drwxr-xr-x. 2 user group 4096 Nov 26 09:50 directory
-rwxr-xr-x. 1 user group    0 Nov 26 09:50 file

Я ищу команду, которая даст в результате

# ls -ld directory file
drwxr-xr-x. 2 user group 4096 Nov 26 09:50 directory
-rw-r-xr--. 1 user group    0 Nov 26 09:50 file

исправляя исполняемые права на каталоге, но оставляя файл без изменений

Ответ или решение

Чтобы рекурсивно изменить права доступа к директориям с помощью команды chmod, необходимо понимать, что команда chmod с ключом +X (большая буква X) действительно устанавливает права на выполнение не только для директорий, но и для файлов, если у этих файлов уже есть права на выполнение для хотя бы одного из пользователей.

Для того, чтобы установить права на выполнение (используя chmod) только для директорий, не затрагивая файлы, можно использовать комбинацию команды find с chmod. Следующий подход обеспечит выполнение этой задачи.

Шаги для установки прав на выполнение только для директорий

  1. Откройте терминал: Убедитесь, что у вас есть необходимые права доступа (обычно требуется быть владельцем директорий или использовать sudo).

  2. Используйте команду find: Для поиска директорий и изменения их прав с помощью chmod, выполните следующую команду:

    find /путь/к/директории -type d -exec chmod ug+x {} \;
    • /путь/к/директории — это путь к корневой директории, в которой вы хотите установить права. Например, это может быть ./ для текущей директории.

    • -type d указывает команде find, что нужно искать только директории.

    • -exec chmod ug+x {} \; выполняет команду chmod ug+x для каждой найденной директории, где {} будет заменено на имя директории, найденной командой find.

  3. Проверка изменений: После выполнения команды вы можете проверить права доступа к директориям с помощью ls -ld:

    ls -ld /путь/к/директории/*

Пример

Допустим, у вас есть структура каталогов следующего вида:

/mystuff
    ├── directory1
    └── file1

Для установки прав на выполнение для directory1 и оставления file1 без изменений, выполните:

find ./mystuff -type d -exec chmod ug+x {} \;

После выполнения этой команды права на directory1 изменятся на rwxr-xr-x, а file1 останется с изначальными правами.

Заключительные замечания

Использование find с chmod является предпочтительным и безопасным способом для выполнения необходимых изменений, так как оно исключает архивные или другие ненужные файлы из процесса изменения прав доступа. Для работы с файлами и директориями всегда рекомендуется тестировать команды в безопасной среде, например, в копиях ваших данных, прежде чем применять их в реальной системе, чтобы избежать потери контроля над доступом к критически важным данным.

Оцените материал
Добавить комментарий

Капча загружается...