Використовуйте команду 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
Напевно, ви не хочете надавати дозволи на виконання всім файлам. Це створить ризик для безпеки. (це один із вірусних векторів в ОС 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 {} +

Працював як шарм, дякую. З повагою, Kumarjit
Kumarjit Ghosh

1
Я підозрюю, що використання +замість цього ;має велике значення.
Кевін

Це швидкий шлях - уникайте перевірки. Далі я б скористався функцією find для складання списку лише тих файлів, у яких ви маєте дозвіл на зміну цього, щоб уникнути chmod помилок на файлах, які він не може змінити. <pre> <code> # rwx, rw, wx, w лише знайти. -user $ (whoami) -perm / 002! -perm 0755 -exec chmod 0755 {} \; # перерва на дві операції знаходження. -user $ (whoami) -perm / 002! -perm 0755> /tmp/chfiles.txt для файлу в $ (</ tmp / chfiles.txt) do chmod --quiet 0755 "$ {file}" зроблено </code> </pre>
Кріс Рейд,

@ChrisReid Зауважте, що перегляд певного списку таких імен шляхів порушиться, якщо будь-яке ім'я шляху містить символ пробілу.
Кусалаланда

Я думаю, вам потрібно змінити роздільник внутрішнього поля (IFS) на "\ n" у сценарії. Це налаштування середовища, спосіб інтерпретації оболонки залежить від значень цих параметрів. Я тестую сценарії на фіктивних файлах, перш ніж використовувати їх для викривлення грізних дистартів, таких як перейменування файлів або їх перезаписування. Мені подобається спосіб printf оболонки встановлення IFS. IFS = $ (printf "\ n") # дуже читабельний
Chris Reid

1

Оскільки ви findотримали -exec ... +синтаксис, використовувати це не так вже й багато xargs, але, як ви просите, це:

find /main_directory -not -perm 0755 | xargs chmod 755

1
Також зауважте, що xargs без -0(у поєднанні з -print0знахідкою; яка є розширенням GNU) може бути досить проблематичною для безпеки, якщо потенційний зловмисник може створити назви файлів, які містять пробіли чи інші спеціальні символи в них. Тож краще дотримуйтесь, -execколи зможете
Matija Nalis

Не потрібно xargs(просто користуйтеся -exec), і якщо ви все-таки користуєтесь цим, ви повинні використовувати -print0/ -0як каже Matija.
Кевін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.