Я пытался очистить разрешения на нескольких ящиках и безуспешно просматривал человека 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)