Есть ли краткая команда 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/*/