Вопрос или проблема
Как я могу рекурсивно выполнить 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
. Следующий подход обеспечит выполнение этой задачи.
Шаги для установки прав на выполнение только для директорий
-
Откройте терминал: Убедитесь, что у вас есть необходимые права доступа (обычно требуется быть владельцем директорий или использовать
sudo
). -
Используйте команду
find
: Для поиска директорий и изменения их прав с помощьюchmod
, выполните следующую команду:find /путь/к/директории -type d -exec chmod ug+x {} \;
-
/путь/к/директории
— это путь к корневой директории, в которой вы хотите установить права. Например, это может быть./
для текущей директории. -
-type d
указывает командеfind
, что нужно искать только директории. -
-exec chmod ug+x {} \;
выполняет командуchmod ug+x
для каждой найденной директории, где{}
будет заменено на имя директории, найденной командойfind
.
-
-
Проверка изменений: После выполнения команды вы можете проверить права доступа к директориям с помощью
ls -ld
:ls -ld /путь/к/директории/*
Пример
Допустим, у вас есть структура каталогов следующего вида:
/mystuff
├── directory1
└── file1
Для установки прав на выполнение для directory1
и оставления file1
без изменений, выполните:
find ./mystuff -type d -exec chmod ug+x {} \;
После выполнения этой команды права на directory1
изменятся на rwxr-xr-x
, а file1
останется с изначальными правами.
Заключительные замечания
Использование find
с chmod
является предпочтительным и безопасным способом для выполнения необходимых изменений, так как оно исключает архивные или другие ненужные файлы из процесса изменения прав доступа. Для работы с файлами и директориями всегда рекомендуется тестировать команды в безопасной среде, например, в копиях ваших данных, прежде чем применять их в реальной системе, чтобы избежать потери контроля над доступом к критически важным данным.