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

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

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

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

Для каталогов: 770 (u + rwx, g + rwx, o-rwx)

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

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

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

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

Не нужны скрипты.

// Каталоги:

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

// Файлы:

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

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

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

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

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

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

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

#!/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

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

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

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

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

chmod 660 $(find . -type f)
chmod 770 $(find . -type d)