CHMOD - применение разных разрешений для файлов и каталогов

9

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

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

Для каталогов: 770 (U + RWX, G + RWX, O-RWX)

Для файлов: 660 (U + rw, g + rw, ax, o-rw)

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

Я предполагаю, что должен быть способ сделать это без написания собственного сценария оболочки - но я не смог ничего найти.

Я ценю вашу помощь!

Skone
источник

Ответы:

10

Я нахожу сценарий полезным, поскольку часто полезно изменить разрешения для файлов и каталогов одним махом, и они часто связаны между собой. 770 и 660 для общих каталогов на файловом сервере, 755/644 для каталогов веб-сервера и т. Д. Я держу сценарий с наиболее часто используемым режимом для этого типа сервера в папке root / и просто выполняю поиск вручную, когда общий Режим не применяется.

#!/bin/sh
# syntax: setperm.s destdir
#
if [ -z $1 ] ; then echo "Requires single argument: <directoryname>" ; exit 1 ;                                       fi

destdir=$1

dirmode=0770
filemode=0660

YN=no

printf "\nThis will RECURSIVELY change the permissions for this entire branch:\n                                      "
printf "\t$destdir\n"
printf "\tDirectories chmod = $dirmode\tFiles chmod = $filemode\n"
printf "Are you sure want to do this [$YN]? "

read YN

case $YN in
        [yY]|[yY][eE][sS])
        # change permissions on files and directories.
        find $destdir -type f -print0 | xargs -0 chmod $filemode $i
        find $destdir -type d -print0 | xargs -0 chmod $dirmode $ii ;;

        *) echo "\nBetter safe than sorry I always say.\n" ;;
esac
iPaulo
источник
Вот Это Да! Это именно то, что я искал. Большое спасибо!
Сконе
Эй, iPaulo - можете ли вы случайно объяснить «$ ii» в строке «найти $ destdir -type d -print0 | xargs -0 chmod $ dirmode $ ii ;;». Я не уверен, что понимаю, почему это не просто "найти $ destdir -type d -print0 | xargs -0 chmod $ dirmode $ i ;;" Спасибо!
Сконе
20

Нет необходимости в скриптах.

// Каталоги:

find . -type d -exec chmod XXX {} \;

// Файлы:

find . -type f -exec chmod XXX {} \;
Солнечный
источник
17

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

chmod -R u=rwX,g=rwX,o= FILE...

Ключевым моментом здесь является заглавная буква X, которую man-страница объясняет как

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

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

Микаэль Ауно
источник
Это здорово, но гораздо дольше, чем просто написание 777. Есть ли сокращение для -X?
Эллиотт Б
6

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

rsync -rpt --chmod=D770,F660 . .

Если вы хотите добавить chownк той же операции, rsyncвы можете сделать это тоже с помощью --chown=user:groupопции.

Мэтью Буш
источник
Ух, это на самом деле намного быстрее, чем chmod -R.
Эпели
Так намного быстрее, чем chmod. Есть ли недостатки использования rsync таким образом? Я делал это много, и все, кажется, хорошо.
ленивец
1

Чисто и просто:

chmod 660 $(find . -type f)
chmod 770 $(find . -type d)
takeshin
источник
Очень элегантный подход.
user5336
3
возможно, но учтите, что это работает, только если в файлах нет пробелов. Более «безопасный» подходfind ... -exec chmod ... {} \;
isaaclw