LINUX.ORG.RU
ФорумAdmin

Как изменить права только к файлам/каталогам?

 


0

2

Подскажите пожалуйста:

Нужно задать права 755 только для каталогов и отдельно права 644 только для файлов. Как это сделать с помощью chmod?



Последнее исправление: Anatuz (всего исправлений: 1)

Ответ на: комментарий от Anatuz

Спасибо, а зачем симмвол «{}»?

На место «{}» - подставляется имя файла, кавычки нужны для экранирования символов-разделителей вроде пробела.

Не проще ли find -type d -exec chmod 755 \*

У меня такой вариант не работает, поэтому не понял...

backbone ★★★★★
()
Ответ на: комментарий от blind_oracle

Зато портабельнее - своими глазами видел find без exec-а! Честное слово видел! (Аж челюсть выпала - оно-ж даже на 386bsd было...)

sergv
()
Ответ на: комментарий от anonymous

Из man

one or more times

похоже, что без разницы - большой список или нет.

а ещё символ ' в имени файла

find -type d -print0 | xargs -0 chmod 755

это?

backbone ★★★★★
()
Ответ на: комментарий от backbone

Из man...

не распарсил что ты пытался сказать, чем меньше execve — тем быстрее; вот с xargs их намноого меньше

anonymous
()
Ответ на: комментарий от anonymous

Я о другом - xargs же разбивает полученный список по группам и для каждой группы выполняет execve->chmod, а не ждёт SIGPIPE/что-то_там и выполняет chmod для всего полученного списка из 100500 файлов.

backbone ★★★★★
()
Ответ на: комментарий от backbone

А, всё, у xargs есть соответствующие ключи -L -n, отвечающие за разбивку. Тогда xargs в любых ситуациях лучше получается...

backbone ★★★★★
()
Ответ на: комментарий от backbone

это?

нет

$ find -name "'" -maxdepth 1 -exec chmod -v 0000 {} +
права доступа «./'» изменены на 0000 (---------)
вот это:
$ mv "'" "'
> '"
$ find -name "'*" -maxdepth 1 | xargs chmod -v 1111
xargs: unmatched одинарная quote; by default quotes are special to xargs unless you use the -0 option
$ find -name "'*" -maxdepth 1 -print0 | xargs -0 chmod -v 1111
права доступа «./'\n'» изменены на 1111 (--x--x--t)
но
$ find -name "'*" -maxdepth 1 -exec chmod -v 0222 {} \;
права доступа «./'\n'» изменены на 0222 (-w--w--w-)

drBatty ★★
()
Ответ на: комментарий от anonymous

а если пробел в имени файла, срыватель покровов?

да хоть \r - УМВР. Сам проверь.

drBatty ★★
()
Ответ на: комментарий от backbone

А, всё, у xargs есть соответствующие ключи -L -n, отвечающие за разбивку. Тогда xargs в любых ситуациях лучше получается...

info find.

плюсик - это и есть xargs.

drBatty ★★
()
Ответ на: комментарий от drBatty

Получается, записи

find -name "'*" -maxdepth 1 -print0 | xargs -0 chmod -v 1111
find -name "'*" -maxdepth 1 -exec chmod -v 1111 {} +
почти эквивалентны.

А ещё такой вариант. Допустим, на одну из директорий установлены права 0000 и find выдаст ошибку чтения каталога. Тогда и +, и | xargs варианты завершатся с ошибкой и нужно явно вызывать для каждого объекта chmod?

backbone ★★★★★
()
Ответ на: комментарий от backbone

почти эквивалентны.

ну если я правильно распарсил документацию - да. Очевидно, что xargs -0 нужно если требуется обработать имена найденных файлов. ИМХО.

Допустим, на одну из директорий установлены права 0000 и find выдаст ошибку чтения каталога. Тогда и +, и | xargs варианты завершатся с ошибкой и нужно явно вызывать для каждого объекта chmod?

нет. Существует 3 порядка (order) обхода дерева:

1. прямой: корень, потом поддеревья/листья.

2. обратный: поддеревья, а потом корень.

3. центрированый. Применяется в бинарных деревьях - левое поддерево - корень - правое. Для ФС не применяется, приходится всё сортировать с нуля...

Так вот, по умолчанию применяется 1й обход. Возможен chmod {} (конечно, если он разрешает права). А с ключом -depth производится 2й обход, и возможно удаление (-delete, -exec rm), и chmod, который запрещает доступ (даже тому, кто обходит).

drBatty ★★
()
Ответ на: комментарий от backbone

Тогда и +, и | xargs варианты завершатся с ошибкой

забыл сказать - xargs НЕ меняет порядок аргументов. В отличие например от *, которая не просто выдаёт список, но его сортирует по алфавиту. По этому, в частности, xargs на больших каталогах намного быстрее, особенно в UTF-8, чем звёздочка.

drBatty ★★
()
Ответ на: комментарий от drBatty

на практике они очень редко помогают...

Не думаю, что случай ТС-а уникален. У самого часто такая потребность возникала после копирования с флешек c fat.

anonymous
()
Ответ на: комментарий от anonymous

Не думаю, что случай ТС-а уникален. У самого часто такая потребность возникала после копирования с флешек c fat.

Mount options for fat

(Note: fat is not a separate filesystem, but a common part of the msdos, umsdos and vfat filesystems.)

<...>

dmask=value Set the umask applied to directories only. The default is the umask of the current process. The value is given in octal.

fmask=value Set the umask applied to regular files only. The default is the umask of the current process. The value is given in octal.

какие проблемы?

drBatty ★★
()
Ответ на: комментарий от drBatty

Спасибо за информацию! Полагаю, что понял всё верно.
Меня вот какой случай интересует. Независимо от порядка обхода дерева очередной элемент дерева может находится в директории, для которой установлены права 0000, но xargs/+ не выполнили для неё chmod 755.

kolan@corka ~/tmp/find $ mkdir -p a/b/c
mkdir: создан каталог «a»
mkdir: создан каталог «a/b»
mkdir: создан каталог «a/b/c»
kolan@corka ~/tmp/find $ chmod 0000 a/b/c a/b a
права доступа «a/b/c» изменены с 0775 (rwxrwxr-x) на 0000 (---------)
права доступа «a/b» изменены с 0775 (rwxrwxr-x) на 0000 (---------)
права доступа «a» изменены с 0775 (rwxrwxr-x) на 0000 (---------)
kolan@corka ~/tmp/find $ ll . a a/b
ls: невозможно получить доступ к a/b: Отказано в доступе
.:
итого 4
d--------- 3 kolan kolan 4096 апр.  29 12:25 a
ls: невозможно открыть каталог a: Отказано в доступе
kolan@corka ~/tmp/find $ find -type d -print0 | xargs -0 chmod -v 0777
find: `./a': Отказано в доступе
права доступа «.» оставлены в виде 0777 (rwxrwxrwx)
права доступа «./a» изменены с 0000 (---------) на 0777 (rwxrwxrwx)
kolan@corka ~/tmp/find $ ll . a a/b
.:
итого 4
drwxrwxrwx 3 kolan kolan 4096 апр.  29 12:25 a

a:
итого 4
d--------- 3 kolan kolan 4096 апр.  29 12:25 b
ls: невозможно открыть каталог a/b: Отказано в доступе
kolan@corka ~/tmp/find $ find -type d -exec chmod -v 0777 {} +
find: `./a/b': Отказано в доступе
права доступа «.» оставлены в виде 0777 (rwxrwxrwx)
права доступа «./a» оставлены в виде 0777 (rwxrwxrwx)
права доступа «./a/b» изменены с 0000 (---------) на 0777 (rwxrwxrwx)
kolan@corka ~/tmp/find $ ll . a a/b
.:
итого 4
drwxrwxrwx 3 kolan kolan 4096 апр.  29 12:25 a

a:
итого 4
drwxrwxrwx 3 kolan kolan 4096 апр.  29 12:25 b

a/b:
итого 4
d--------- 2 kolan kolan 4096 апр.  29 12:25 c

Но без +, то есть когда в chmod передаются аргументы по одному, команда завершится без ошибок.

kolan@corka ~/tmp/find $ find -type d -exec chmod -v 0777 {} \;
права доступа «.» оставлены в виде 0777 (rwxrwxrwx)
права доступа «./a» изменены с 0000 (---------) на 0777 (rwxrwxrwx)
права доступа «./a/b» изменены с 0000 (---------) на 0777 (rwxrwxrwx)
права доступа «./a/b/c» изменены с 0000 (---------) на 0777 (rwxrwxrwx)
kolan@corka ~/tmp/find $ ll . a a/b
.:
итого 4
drwxrwxrwx 3 kolan kolan 4096 апр.  29 12:25 a

a:
итого 4
drwxrwxrwx 3 kolan kolan 4096 апр.  29 12:25 b

a/b:
итого 4
drwxrwxrwx 2 kolan kolan 4096 апр.  29 12:25 c

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

find -type d -exec chmod -v 0755 {} \;
find -type f -exec chmod -v 0644 {} +

Вторая команда может быть заменена на xargs, если есть какие-то дополнительные требования к разбивке группы аргументов.
find -type f -print0 | xargs -0 chmod -v 0644

Так, нет?

backbone ★★★★★
()
Ответ на: комментарий от backbone

Но без +, то есть когда в chmod передаются аргументы по одному, команда завершится без ошибок.

ну а что вы хотели, если получить список нельзя, по той причине, что доступ к внутренним каталогам закрыт. Очевидно, что приходится обходить каталоги, и сразу их открывать, ибо нельзя войти в закрытую дверь, а _потом_ её открыть.

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

не знаю. Смотря что у вас за файлы/каталоги, и что вы с ними хотите сделать.

drBatty ★★
()
Ответ на: комментарий от backbone

очередной элемент дерева

тогда для этого случая сферического chmod в вакууме идеологиечески правильней всего делать расово православный циклический рекурсивный find со скриптом.

mumpster ★★★★★
()
Ответ на: комментарий от mumpster

По-моему, совершенно вероятна ситуация, когда пользователь снял права r или x для владельца. Кстати, зачем может быть нужна такая возможность?
Как правило число директорий много меньше числа файлов и замена '+' на '\;' не скажется на времени выполнения команды, зато гарантирует положительный результат.

find -type d -exec chmod -v 0755 {} \;
find -type f -exec chmod -v 0644 {} +
Вообще, не часто приходится выполнять рекурсивный chmod для директорий.

backbone ★★★★★
()
Ответ на: комментарий от backbone

x очень часто снимают чтобы содержимое папки не смотрели. например для хомяка. r бывает снято по ошибке или при копировании с FAT.

mumpster ★★★★★
()
Ответ на: комментарий от mumpster

x очень часто снимают чтобы содержимое папки не смотрели

А чтобы u-rx для директории в каких случаях? Приходит на ум только «по ошибке».

backbone ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.