Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: chmod в Ubuntu  (Прочитано 11707 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн allexnew

  • Автор темы
  • Любитель
  • *
  • Сообщений: 76
    • Просмотр профиля
chmod в Ubuntu
« : 09 Октября 2009, 22:29:38 »
Чего то разработчики по-моему намудрили в этой утилитке. Отказывается  принимать ключ -R (рекурсия) при определенной маске, например, при задании таких параметров:

chmod -R 644 ./*

Разрешения меняются, включая подкаталоги. При задании такой маски:

chmod -R 644 ./*.*

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

аналогичная ситуация с:

chmod -R 644 *.*
chmod -R 644 *.gif

Требовалось назначить минимальные права на все содержимое каталога (каталогам 755, файлам 644 (все файлы имели расширение)). Пришлось изобретать велосипед при помощи утилитки tree.

Наблюдается в Ubuntu 8.04 server, Ubuntu 9.04. Или я чего то недопонимаю? По-моему в ранних версиях убунты сей прием отрабатывался как надо...


Может кому интересно решение задачи на коленке:

Меняем на всех объектах права на 644:

chmod -R 644 ./*

Вываливаем список каталогов в файл:

tree -a -i -f -d > access.sh

в этом файле заменяем с помощью редактора "./" на "chmod 755 ./"

делаем файл исполняемым и запускаем. Громоздко, конечно, но если объектов тысячи, да еще и куча уровней...

« Последнее редактирование: 09 Октября 2009, 22:31:50 от allexnew »
Если ничего не помогает, попробуйте все-таки прочесть инструкцию.

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: chmod в Ubuntu
« Ответ #1 : 09 Октября 2009, 22:34:56 »
Use "find", Luke!
Чем find не угодил?
find ./path -type f -exec chmod 644 {} \;
find ./path -type d -exec chmod 755 {} \;
Поправьте, если не прав :)
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн allexnew

  • Автор темы
  • Любитель
  • *
  • Сообщений: 76
    • Просмотр профиля
Re: chmod в Ubuntu
« Ответ #2 : 09 Октября 2009, 22:36:33 »
Ну как то к маскам привык. Да и писать много :(. Дак это не баг чтоли?

Но ведь маска *.* так или иначе обрабатывается командой, но только для текущего каталога. Вот почему интересно? Если бы такая маска не поддерживалась, наверное она вообще бы не обрабатывалась.
« Последнее редактирование: 09 Октября 2009, 22:38:43 от allexnew »
Если ничего не помогает, попробуйте все-таки прочесть инструкцию.

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: chmod в Ubuntu
« Ответ #3 : 09 Октября 2009, 22:40:49 »
А я ваще без понятия баг это или где! :D
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн easy2002

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 2786
  • Мурманск
    • Просмотр профиля
Re: chmod в Ubuntu
« Ответ #4 : 09 Октября 2009, 22:41:31 »
IMHO find правильнее и логичнее  :)
Tempora mutantur et nos mutantur in illis

Оффлайн allexnew

  • Автор темы
  • Любитель
  • *
  • Сообщений: 76
    • Просмотр профиля
Re: chmod в Ubuntu
« Ответ #5 : 09 Октября 2009, 22:43:08 »
И все же хотелось бы узнать логичный ответ почему так происходит. Почему при такой маске игнорируется рекурсия?

Пользователь решил продолжить мысль 09 Октября 2009, 22:49:10:
Не поленился, проверил во FreeBSD 622 - тоже самое. Похоже это не баг, это особенность. И все же мне непонятно почему... хех...
« Последнее редактирование: 09 Октября 2009, 22:49:10 от allexnew »
Если ничего не помогает, попробуйте все-таки прочесть инструкцию.

Оффлайн Kwah

  • Старожил
  • *
  • Сообщений: 1442
  • Ubuntu 17.10
    • Просмотр профиля
Re: chmod в Ubuntu
« Ответ #6 : 10 Октября 2009, 02:13:41 »
Видимо потому, что маска *.* срабатывает на: что-то-непустое|точка|что-то-ещё-не-пустое?

Оффлайн allexnew

  • Автор темы
  • Любитель
  • *
  • Сообщений: 76
    • Просмотр профиля
Re: chmod в Ubuntu
« Ответ #7 : 10 Октября 2009, 17:07:18 »
Видимо потому, что маска *.* срабатывает на: что-то-непустое|точка|что-то-ещё-не-пустое?

Я так понимаю, что "|" подразумевает "или". Еще, как вариант, это если сама рекурсия руководствуется маской. Т.е. если объект (в данном случае каталог) не удовлетворяет маске, то внутренности этого объекта не просматриваются далее. По-моему это самое логичное объяснение, хотя политика такой позиции мне все же не ясна.

Пользователь решил продолжить мысль 10 Октября 2009, 15:16:53:
Проверил. Собственно так оно и есть. Если каталог состоит "из двух частей с точкой", то его объекты (имеется ввиду файлы и каталоги удовлетворяющие маске) обрабатываются.

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

-- WIKI --
В программировании рекурсия — вызов функции (процедуры) из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная рекурсия), например, функция A вызывает функцию B, а функция B — функцию A. Количество вложенных вызовов функции или процедуры называется глубиной рекурсии.
« Последнее редактирование: 10 Октября 2009, 17:23:19 от allexnew »
Если ничего не помогает, попробуйте все-таки прочесть инструкцию.

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: chmod в Ubuntu
« Ответ #8 : 10 Октября 2009, 17:28:14 »
Видимо потому, что маска *.* срабатывает на: что-то-непустое|точка|что-то-ещё-не-пустое?
Я так понимаю, что "|" подразумевает "или".
В данном случае это просто разделитель.
Если в имя каталога добавить точку, то он наверняка попадёт под действие регэкспа.

Оффлайн allexnew

  • Автор темы
  • Любитель
  • *
  • Сообщений: 76
    • Просмотр профиля
Re: chmod в Ubuntu
« Ответ #9 : 13 Октября 2009, 03:26:15 »
Я вот тут подумал... может регулярные выражения вместо маски можно использовать... надо завтра будет попробовать.
Если ничего не помогает, попробуйте все-таки прочесть инструкцию.

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: chmod в Ubuntu
« Ответ #10 : 13 Октября 2009, 21:41:29 »
Я вот тут подумал... может регулярные выражения вместо маски можно использовать... надо завтра будет попробовать.
Ну, кагбэ, маско это и есть регулярко... :)
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн Igor905_2

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
    • igorka.com.ua
Re: chmod в Ubuntu
« Ответ #11 : 20 Октября 2009, 12:41:12 »
Может неправильно вопрос понял, но если нужно всем каталогам назначить 755, а файлам 644, то вот я так сделал:
sudo chmod -R 755 ./Музыка/
sudo chmod -R a-x ./Музыка/
sudo chmod -R a+X ./Музыка/

Оффлайн allexnew

  • Автор темы
  • Любитель
  • *
  • Сообщений: 76
    • Просмотр профиля
Re: chmod в Ubuntu
« Ответ #12 : 22 Октября 2009, 09:50:19 »
Может неправильно вопрос понял, но если нужно всем каталогам назначить 755, а файлам 644, то вот я так сделал:
sudo chmod -R 755 ./Музыка/
sudo chmod -R a-x ./Музыка/
sudo chmod -R a+X ./Музыка/


Да нет, вы как раз все правильно поняли...
Всю жизнь был уверен, что задание прав в символьном режиме эквивалентно восьмеричному, поэтому символьным режимом пользовался крайне редко. Вот все беды от лени, поленился в man залезть :(. Ладно буду теперь знать, но вопрос о рекурсии все же пока еще открыт.

На всякий случай, для других:

sudo chmod -R a+X [объект]

где,

a - пользователь "Все остальные";
+X - назначение прав на выполнение, только если объект является каталогом.

Igor905_2 = 5+

Единственное что я бы оптимизировал до такого, если права на группу не важны:

sudo chmod -R 744 ./Музыка/
sudo chmod -R a+X ./Музыка/

или, если важны:

sudo chmod -R 754 ./Музыка/
sudo chmod -R a+X ./Музыка/
« Последнее редактирование: 22 Октября 2009, 10:12:12 от allexnew »
Если ничего не помогает, попробуйте все-таки прочесть инструкцию.

Оффлайн Frank

  • Старожил
  • *
  • Сообщений: 1799
  • Профессиональный любитель
    • Просмотр профиля
    • Народный форум Николаева
Re: chmod в Ubuntu
« Ответ #13 : 22 Октября 2009, 09:55:47 »
вопрос о логике действия маски все же пока еще открыт.
* - означает любой набор любых символов
*.* - означает любой набор любых символов, среди которых в каком-то месте есть символ точки
чего непонятного то?
И ещё - маска разворачивается в аргументы сразу при запуске команды, ещё самим интерпретатором (шеллом), а не программой. Поэтому если есть ключ рекурсивности, то команда будет применена ко всем объектам, попавшим под маску. Например, chmod -R 644 *.gif будет применено ко всем файлам с расширением .gif в текущей (или указанной) папке, а так же ко всем файлам в папке some.pictures.in.gif - даже если в этой папке совсем не .gif файлы. Именно потому, что chmod обрабатывает параметры как текстовые имена, всё равно чьи они - файлов или папок.
Иными словами, автор не понимает значения ключа рекурсивности. Если нужно обработать исключительно .gif файлы во вложенных папках, необходимо применение конструкции find ... -type f -name '*.gif' ... exec ... chmod {}\;
« Последнее редактирование: 22 Октября 2009, 10:06:52 от Frank »

Оффлайн allexnew

  • Автор темы
  • Любитель
  • *
  • Сообщений: 76
    • Просмотр профиля
Re: chmod в Ubuntu
« Ответ #14 : 22 Октября 2009, 09:59:47 »
Цитировать
Иными словами, автор не понимает значения ключа рекурсивности.

Не совсем так, вернее сказать не до конца понимает. Поизучаю на досуге более подробнее.
Всем спасибо.
« Последнее редактирование: 22 Октября 2009, 10:13:27 от allexnew »
Если ничего не помогает, попробуйте все-таки прочесть инструкцию.

 

Страница сгенерирована за 0.018 секунд. Запросов: 20.