Рекурсивний chmod: rw для файлів, rwx для каталогів


28

Хочу chmodбагато файлів і каталогів. Як xвказує список для каталогів та виконання для звичайних файлів, я хотів би подати заявку rwна файли та rwxв каталоги. Чи можливо використовувати лише chmodкоманду?

Якщо це не так, то який найзручніший спосіб?

Робити chmod -R 770це не є можливістю, оскільки я не хочу, щоб звичайні файли ставали виконуваними.


1
Ви дійсно хочете публічного дозволу на запис у файли та каталоги? Це означає, що вам все одно, хто клобує будь-який файл?
Джонатан Леффлер

Правда. Я змінив її вище.
Видалено

Відповіді:


19

Я роблю це при нагоді, використовуючи одну findкоманду. Некрасивий, але ефективний.

find /p/a/t/h \( -type d -exec chmod 755 {} \; \) -o \( -type f -exec chmod 644 {} \; \)

Чи не потрібно "{}" цитувати, на випадок, якщо шляхи містять пробіли? Як find . -type d -exec chmod -vc 755 "{}" \;(у тому числі -vcдля деякого відгуку). (І, можливо, просто для уточнення додайте до відповіді також дві автономні команди?)
Арджан

Ні, {} не потрібно його цитувати (я лише перевірив, щоб бути абсолютно впевненим). Коли знайдете в команду вставки {}, вона буде належним чином виконана. Я не шукав внутрішніх функцій пошуку, але я б припустив, що це створює масив аргументів для передачі в exec (), і він буде strcpy () ім'я файлу в масив. Коли chmod розглядає свої аргументи, це відображатиметься належним чином.
baumgart

37

Скористайтеся дозволом X зі сторінки man:

Біти виконання / пошуку, якщо файл - це каталог, або будь-який із бітів виконання / пошуку встановлений у вихідному (немодифікованому) режимі. Операції із символом perm "X" мають сенс лише у поєднанні із символом op "+", і ігноруються у всіх інших випадках.

Тому виконайте наступне:

chmod -R a-x [directory]
chmod -R a+rwX [directory]

Це видаляє біт виконання з усіх файлів і каталогів з подальшим додаванням до всіх привілеїв для читання і запису та виконання привілеїв лише до каталогів. (Жодні звичайні файли вже не мають біту виконання з першого кроку.)


1
це не запустить режим 666 для звичайних файлів. він не очищає виконуваний біт для звичайних файлів, якщо вони вже встановлені.
шарлатаний кіхот

То в такому випадку ви могли б chmod -R a-x [directory]слідувати chmod -R a+rwX [directory]?
jwaddell

@jwaddel: Це повинно працювати. Ви видаляєте всі біти виконання, незалежно від типу файлу / каталогу, потім додаєте Execute лише до каталогів та звичайних файлів, у яких вже є біт виконання (якого зараз немає.)
Ben S

Як тільки я це роблю a-x, каталог стає недоступним. Насправді, chmod не дає дозволу, який заборонено і не видалить виконуваний біт з файлів у каталозі. Чи є спосіб це зробити, не використовуючи корінь?
авакар

14

Ви також можете використовувати findразом із xargs:

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

де -typeвказується d irectory або f ile.


1
Чи не має xargs обмеження довжини? Це багато файлів і каталогів.
Видалено

2
Я б спочатку робив каталоги, потім файли. В іншому випадку ви ризикуєте пропустити якесь піддерево через відсутність дозволу. Також слід перевірити, чи розглядають список до або після chmod, інакше такий же, як вище. І так, я б утримався від використання xargs.
Стефано Борині

1
xargsдостатньо розумний, щоб розбити довгі командні рядки до кількох виконань. Зверніться до своєї сторінки xargs і обов'язково перевірте xargs --show-limits.
Майк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.