1

У меня есть изолированный кластер систем Linux, систем Windows и устройств, монтирующих набор удаленных общих ресурсов (через NFS и CIFS). ОС, разделяющая файловые системы, - Linux. Я часто создаю новые удаленные ресурсы, которые также становятся доступными. У меня есть определенный набор требований к разрешениям и владельцам файлов, которые я выполняю в настоящее время с помощью следующих команд (в небольшом скрипте bash):

find -type d -exec chmod u=rwx {} \;
find -type d -exec chmod go=rx {} \;
find -type f -exec chmod u=rw {} \;
find -type f -exec chmod go=r {} \;
find . -exec chown nobody {} \;
find . -exec chgrp nogroup {} \;
find -name ".*" -exec chown nobody {} \;
find -name ".*" -exec chgrp nogroup {} \;

Это занимает вечно большую файловую систему. Я ищу способ сделать это значительно быстрее.

В частности:

  1. Все файлы и каталоги (включая скрытые файлы и каталоги '.') Должны принадлежать "nobody".
  2. Все файлы и каталоги (включая скрытые файлы и каталоги '.') Должны быть группой 'nogroup'.
  3. Все файлы должны иметь права «rw» для владельца и права «r» для группы и других
  4. Все каталоги должны иметь права «rwx» для владельца и права «rx» для группы и других

2 ответа2

1

И chown и chmod предлагают опцию -R которая делает рекурсивную. Эти две команды делают почти все, что вы хотите, и довольно быстро:

chmod -R u=rwX,go=rX *
chown -R nobody:nogroup *

Режим u=rwX устанавливает пользовательский режим для чтения и записи и, при условии, что файл / каталог уже имеет разрешение на выполнение для кого-либо, eXecute. Таким образом, это сохраняет разрешение на выполнение для каталогов, но не способствует выполнению других файлов, если у них уже не было этого атрибута. go=rX дает разрешение на чтение для группы и других пользователей и при тех же условиях разрешает выполнение.

Команда chown -R nobody:nogroup * изменит владельца на nobody и рекурсивно сгруппирует в nogroup для всех файлов.

Эти команды работают со скрытыми файлами во всех рекурсивных каталогах. Глоб * не находит скрытые файлы в текущем каталоге. Это можно исправить либо (1) указав их явно, либо (2) установив опцию bash's dotglob : shopt -s dotglob .

Удаление разрешения на выполнение

Если у вас есть нормальные файлы, которым нужно удалить разрешение на выполнение, вот ускорение для этого:

find -type f -executable -exec chmod a-x {} +

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

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

0

Одна вещь немедленно ускорит процесс, не используя -exec в поиске, а передавая полученные имена в xargs:

 find . -type d -print0 | xargs -0 chmod 777 

Выше приведен только пример, -print0 правильно передает эти грязные файлы со странными именами файлов, а параметры -0 в команде xargs правильно читают этот вывод.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .