Назад | Перейти на главную страницу

Как изменить права доступа к папкам, но не к файлам?

Есть ли краткая команда linux (которая будет работать в OSX) для изменения разрешений на папки и все их содержимое, но оставить файлы в текущем каталоге нетронутыми? Например:

/ parent / folder1 <- изменение разрешений
/ parent / folder2 <- изменение разрешений
/ parent / folder3 <- изменение разрешений
/ parent / folder3 / file1 <- изменение разрешений
/ parent / folder3 / file2 <- права доступа
/ parent / file1 <-не изменять разрешения
/ parent / file2 <-не изменять разрешения

Я полагаю, вам нужно будет запустить 2 команды. Вот один из способов сделать это:

# find . -mindepth 1 -type d | xargs chmod 700
# find . -mindepth 2 | xargs chmod 700

Первый делает каталоги на текущем уровне каталогов и глубже. Второй делает все файлы и каталоги глубже, чем текущий каталог.

Это изменит разрешения для каждого каталога в текущем каталоге и всех файлов и папок в них, я думаю, что вы хотите, но будьте осторожны из-за рекурсии ...

find . -maxdepth 1 -type d -exec chmod -R 700 {} \;

Вы можете использовать find для этого или, может быть, с петлей, for:

for directory in parent/*; do if [ -d $directory ]; then chmod -R 700 $directory; fi ;done

Есть один тривиальный случай, когда chmod может сделать это самостоятельно. Если вы установите режим +X (обратите внимание, заглавная, а не строчная), это применимо только к каталогам. Это обычно используется в тех случаях, когда вы хотите сделать все файлы в группе дерева каталогов или всем доступным для чтения. Вы бы сделали что-то вроде этого:

chmod a+rX somedir

Это добавит разрешение на чтение и выполнение для somedir и все каталоги под ним, но просто разрешение на чтение для обычных файлов под ним. Однако, к сожалению, нет соответствующего режима для разрешений на чтение / запись.

find  . -type d -mindepth 1 -print -exec chmod 755 {}/* \;

Найдите все подкаталоги текущего каталога (-type d и -mindepth 1) и запустите chmod для всех файлов в каждом найденном каталоге.

{} относится к поиску каталога, который оценивает, и /* указывает chmod работать только с файлами в этом каталоге.

Вот однострочник для общего случая:

find /parent -maxdepth 1 -type d -print0 | xargs -0 chmod -R 700

В -print0 и -0 аргументы используют NUL вместо новой строки в качестве разделителя записей, поэтому это безопасно для имен файлов с пробелами, новой строкой и т. д. И в отличие от -exec, он объединяет имена файлов в меньшее количество вызовов chmod.

Бонус:

В тех случаях, когда вы знаете, что у вас нет скрытых каталогов на верхнем уровне /parent (лайк /parent/.foo) еще проще:

chmod -R 700 /parent/*/