Используйте команду chmod выборочно

11

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

find /main_directory/ -exec chmod 755 {} \;

Если findкоманда возвращает длинный список, это займет много времени. Я знаю, что могу использовать команду stat для проверки разрешения уровня файла Octal каждого компонента, а затем использовать if-else для переключения разрешения файла, но есть ли какой-либо однострочный подход, использующий findи xargsсначала проверяющий, какое разрешение имеет файл / каталог , а затем используйте, chmodчтобы изменить его на 755, если он установлен на что-то другое.

Кумарджит Гош
источник
6
Это может быть преждевременной оптимизацией, а может даже и не сделать ее быстрее. Выполнение всех этих проверок может замедлить его. Тестирование, чтобы убедиться, что это быстрее, окупится, только если вам придется делать это много.
Ctrl-Alt-Delor
3
Вы, вероятно, не хотите давать разрешения на выполнение всем файлам. Это создаст угрозу безопасности. (это один из векторов вирусов в Microsoft Windows: все исполняемое). В символическом режиме можно сказать u+rw,go+r,go-w,ugo+X- обратите внимание на столицу.
Ctrl-Alt-Delor
Я согласен с @ ctrl-alt-delor, но предлагаю что-то более близкое к тому, что вы просили, u = rwX, go = rX, что должно достичь того же.
penguin359

Ответы:

21

Если вы хотите изменить разрешения 755как для файлов, так и для каталогов, использование не имеет реальной выгоды find(по крайней мере, с точки зрения производительности), и вы можете просто сделать

chmod -R 755 /main_directory

Если вы действительно хотите использовать, findчтобы избежать изменения разрешений для вещей, у которых уже есть 755разрешения (чтобы не обновлять их метку времени ctime), то вам также следует проверить текущие разрешения для каждого каталога и файла:

find /main_directory ! -perm 0755 -exec chmod 755 {} +

Он -exec ... {} +соберет как можно больше путевых имен, которые пройдут ! -perm 0755тест, и выполнит их chmodвсе сразу.

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

find /main_directory   -type d ! -perm 0755 -exec chmod 755 {} +
find /main_directory ! -type d ! -perm 0644 -exec chmod 644 {} +
Кусалананда
источник
Работал как шарм, спасибо. С уважением, Кумаджит
Кумаджит Гхош
1
Я подозреваю, что использование +вместо ;имеет большое значение здесь.
Кевин
Это быстрый способ - избегайте проверки. Кроме того, я бы использовал find, чтобы составить список только тех файлов, на которые у вас есть права на изменение, чтобы избежать ошибок chmod в файлах, которые он не может изменить. <pre> <code> # rwx, rw, wx, w только находят. -пользователь $ (whoami) -perm / 002! -perm 0755 -exec chmod 0755 {} \; # разбить на две операции find. -пользователь $ (whoami) -perm / 002! -perm 0755> /tmp/chfiles.txt для файла в $ (</ tmp / chfiles.txt) do chmod --quiet 0755 "$ {file}" done </ code> </ pre>
Крис Рейд
@ChrisReid Обратите внимание, что циклический просмотр списка путей, подобных этому, прекратится, если любое из путей содержит символ пробела.
Кусалананда
Я предполагаю, что вам нужно изменить внутренний разделитель полей (IFS) на '\ n' в скрипте. Это параметры среды, то, как их интерпретирует оболочка, зависит от значений этих параметров. Я проверяю сценарии на фиктивных файлах, прежде чем использовать их для обнаружения грубых ошибок, таких как переименование файлов или их перезапись. Мне нравится оболочка printf способ установки IFS. IFS = $ (printf "\ n") # очень читабельно
Крис Рид,
1

Как findполучил -exec ... +синтаксис, нет особого смысла в использовании xargs, но, как вы просите его:

find /main_directory -not -perm 0755 | xargs chmod 755
Хенрик поддерживает сообщество
источник
1
Также обратите внимание, что xargs без -0(в сочетании с -print0поиском; который является расширением GNU) может быть довольно проблематичным с точки зрения безопасности, если потенциальный злоумышленник может создать имена файлов, которые содержат пробелы или другие специальные символы в них. Так что лучше придерживайся, -execкогда сможешь
Матия Налис
Нет необходимости xargs(просто использовать -exec), и если вы используете его, вы должны использовать -print0/, -0как говорит Матия.
Кевин