Хмод рекурсивно


249

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

Я розглянув цю тему: chmod: Як рекурсивно додавати дозволи на виконання лише до файлів, які вже мають дозвіл на виконання, як у деяких інших, але немає радості.

Спочатку каталоги мають декілька, але всі неправильні прапори, вони можуть відображатися як:

drwx------
d---r-x---
drwxrwxr-x
dr--r-xr--

Це лише кілька тих, кого я виявив поки що, але може бути і більше.

findпомилки, коли намагається заглянути в каталог без xдозволу, і тому не передає його chmod. Те, що я робив до цього часу, - це змінити дозволи вручну в батьківському каталозі, потім перейти в дочірні каталоги і зробити те саме для них тощо. Але це багато ручної праці. Чи не існує способу зробити це автоматично?

Тобто, як я це роблю зараз:

робити:

$ chmod -R +x
$ chmod -R +r

поки я не отримаю помилок, значить

$ find -type f -exec chmod -x {} +

Але повинен бути кращий шлях.


3
-r не те саме, що -R
PJ Brunet

Інше зауважте, якщо ви хочете сказати, щоб всі групові дозволи збігалися з дозволами власника (здається, менше шансів підсилити
ThorSummoner

Відповіді:


131

Для того, щоб виконати доступ, вам потрібен доступ для читання, щоб перелічити каталог. Якщо у вас є лише доступ до виконання, ви можете дізнатись назви записів у каталозі, але ніякої іншої інформації (навіть не типів, тому ви не знаєте, які з записів є підкаталогами). Це працює для мене:

find . -type d -exec chmod +rx {} \;

2
Яка різниця між '\;' та "+", який використовувався ОП в кінці команди?
kon psych

1
@konpsych Мабуть, +інший спосіб будує командний рядок. Я насправді цього не знав; \;є звичайним способом, з однією командою на файл, яка відповідає пошуку.
Фред Фоо

Не працює, якщо в деяких файлах є пробіли в їх імені
Soonts

3
@Soonts Тоді "{}"замість цього {}слід виправити.
user4642212

Я запускав це під підсистемою linux в Windows 10, і це мало протилежний ефект. Більшість дозволів на файли було видалено.
Макс Кандокія

176

Ви можете використовувати chmod з Xбуквою режиму ( велика літера X), щоб встановити прапор, що виконується, лише для каталогів.

У наведеному нижче прикладі очищений прапор очищається, а потім встановлюється для всіх каталогів рекурсивно:

~$ mkdir foo
~$ mkdir foo/bar
~$ mkdir foo/baz
~$ touch foo/x
~$ touch foo/y

~$ chmod -R go-X foo 
~$ ls -l foo
total 8
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 bar
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y

~$ chmod -R go+X foo 
~$ ls -l foo
total 8
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 bar
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y

Трохи пояснень:

  • chmod -x foo- очистити прапор eXecutable дляfoo
  • chmod +x foo- встановити прапор eXecutable дляfoo
  • chmod go+x foo- як і вище, але встановіть прапор лише для користувачів Групи та інших користувачів, не торкайтеся дозволу користувача (власника)
  • chmod go+X foo - те саме, що вище, але стосується лише каталогів, не торкайтеся файлів
  • chmod -R go+X foo- те саме, що вище, але робити це рекурсивно для всіх підкаталогівfoo

80

Спробуйте змінити всі дії одночасно:

chmod -R +xr

Це також дозволить виконувати дозволи на всі не-каталоги.
Фред Фоо

1
Так. Це просто замінює перший ітераційний крок. Вам все одно доведеться бігати find -type f -exec chmod -x {} +після цього.
choroba

50

Щоб власник усе записував, читайте / виконуючи групу та світ, що виконується:

chmod -R 0755

Щоб зробити все відкритим:

chmod -R 0777

12
Додайте поточне місцезнаходження папки:chmod -R 0777 .
Данієль

18

Додавання виконуваних дозволів, рекурсивно , до всіх файлів (не папок) у поточній папці з shрозширенням:

find . -name '*.sh' -type f | xargs chmod +x

* Помітьте трубу ( |)


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.