Как рекурсивно удалить разрешения на выполнение из файлов, не касаясь папок?

42

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

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

sudo chmod -R a-x folder\ with\ restored\ backup/

Но это неправильно, так как удаляет xразрешение из каталогов, что делает их нечитаемыми.

Какова правильная команда в этом случае?

gaazkam
источник
1
Мета: Я никогда не понимал, почему системы Unix добавляют бит выполнения к файлам, смонтированным из файловых систем DOS или Windows. Никто и никогда не выполнит эти файлы. Я обычно добавляю «noexec» к моим параметрам монтирования везде, где это возможно.
Эдвард Фальк

Ответы:

70
chmod -R -x+X *

В -xудаляет права на выполнение для всех добавит права на выполнение для всех, но только для каталогов.
+X

Джек Гибб
источник
2
Команда, которую я в конечном итоге использовал для восстановления нормальных разрешений: `chmod -R a-x + X, u-x + rwX, go-wx + rX directory / name`
gaazkam
3
Также см . Ответ Эдварда об исключении для BSD
fikr4n
4
Это не соответствует требованию «не трогать папки». Что, если execute (возможно, для всего мира) был намеренно удален в некоторых каталогах? Вы не должны добавлять его.
Бен Фойгт
4
это не сработало на Mac. Если переместить флаг -R в начало, это сработает в терминалах Linux и Mac. chmod -R -x+x *
JoeMoe1984
2
На самом деле с правильным порядком он работает на OSX, но на самом деле он не дает желаемого эффекта. Вы должны сделать это как два отдельных шага:chmod -R -x * && chmod -R +X *
Timmmm
14

Хорошо, я перечитал справочные страницы "chmod" для Mac OS X, BSD и Linux и провел несколько экспериментов. Вот что я узнал о символических режимах. Это может быть сложно, но это стоит понять:

  • Общая форма - это пункт [, пункт ...], где:
  • предложение : = [ugoa] [+ - =] [rwxXstugo]
  • [ugoa] ( кто ) (указать несколько) означает установить разрешение для пользователя, группы, других или всех. Если не указано, по умолчанию используется значение «а», но действует маска .
  • [+ - =] ( действие ) (указать одно) означает:
    • + означает добавление указанных разрешений к уже действующим разрешениям
    • - означает удаление указанных разрешений из разрешений, уже действующих
    • = означает установить разрешения для указанных разрешений, очистив все остальные
  • [rwxXstugo] ( разрешение ) (укажите несколько из rwxXst ИЛИ одно из ugo) устанавливает разрешения для указанных пользователей следующим образом:
    • r - читать
    • w - написать
    • x - выполнить / поиск
    • X - выполнить / выполнить поиск, если каталог ИЛИ любой бит выполнения уже был установлен.
    • s - suid или sgid
    • т - липкий
    • u - скопировать разрешение пользователя
    • g - скопировать разрешение группы
    • o - скопировать другое разрешение

Так, например, a+xсделал бы файл исполняемым всеми. a+Xсделает файл исполняемым всеми, если он исполняется кем угодно.

a+xсделает каталог доступным для поиска всеми. a+Xтакже сделает каталог доступным для поиска всеми.

Основное различие между BSD и Linux заключается в том, что с BSD определение выполняется на основе прав доступа к файлу до выполнения chmod. При использовании Linux определение выполняется непосредственно перед выполнением предложения + X.

Таким образом, в случае BSD комбинация a-x,a+Xуберет разрешение на выполнение / поиск, а затем сделает каталог доступным для поиска для всех и сделает файл исполняемым для всех. если он изначально был исполняемым кем-либо.

С Linux, a-x,a+X удаляет разрешение на выполнение / поиск, а затем делает каталог доступным для поиска для всех, оставляя файл исполняемым никем.


Вот конкретный пример: на компьютере BSD: каталог, исполняемый файл и неисполняемый файл:

drwxr-x---  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x---  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

Обратите внимание, что как каталог, так и «fie» выполняются / доступны для поиска пользователем, но не другими.

Сейчас мы выполняем chmod a-x,a+X *. В первом предложении для всех файлов будет удален бит выполнения / поиска для всех пользователей, а во втором предложении он будет добавлен обратно как для "fee", так и для "fie". "fee", потому что это каталог, и "fie", потому что у него был хотя бы один исполняемый бит для начала.

drwxr-x--x  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x--x  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

У меня был тот же результат выполнения chmod -x+X.

Вывод: решение Jak Gibb будет работать на Linux, но для BSD вам нужно будет сделать два прохода.

Я не проверял это на SVr4 или других вариантах Unix.

Эдвард Фальк
источник
Приятно читать. Спасибо за исследование этого.
Джек Гибб
10

Один из способов сделать это:

find backup -type f -exec chmod 0644 {} +
Сату Кацура
источник
6
Это может привести к добавлению или удалению разрешений, которые вы не хотите менять. Лучше использоватьchmod a-x {}
Эдвард Фальк
1
@EdwardFalk chmod a-x {}также может в конечном итоге удалить разрешения, которые вы не хотите изменять, и он может оставить файлы для записи во всем мире. Дело в том, что 0644 - это «в целом разумный» компромисс. ОП должен, конечно, также задействовать мозг, прежде чем применять решения из Интернета на своем компьютере.
Satō Katsura
4
«ax» удаляет разрешение на выполнение для пользователя, группы, других и оставляет остальные разрешения без изменений, насколько я знаю. У меня что-то не так?
Эдвард Фальк
1
@ EdwardFalk Нет, ты прав. Но вы не знаете, что такое набор файлов, и не знаете, какие у вас были разрешения chmod. Если файлы резервных копий содержат скрипты и двоичные файлы, удаление xиз них является неправильным. Если chmodпредыдущие разрешения равны 0777, chmod a-xони все равно останутся 0666, что, вероятно, не то, что вам нужно. Я говорю, что chmod 0644лучше эвристика, а не chmod a-xтак.
Satō Katsura
1
@NajibIdrissi За исключением случаев, когда, вы знаете, они изменились на 0777, когда вы скопировали их в чужую файловую систему, не имеющую разрешений UNIX. Именно это и сделал ОП.
Satō Katsura
6
 find backup ! -type l ! -type d -exec chmod a-x {} +

Отменяет разрешение на выполнение для файлов, которые не относятся к каталогу типа (как вы просили) или символической ссылке ( символические ссылки обычно всегда rwxrwxrwx и chmodвлияют на назначение символической ссылки на них).

Обратите внимание, что:

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

изменил бы только разрешение обычных файлов. Это исключает каталоги и символические ссылки , но также устройства , именованные каналы , сокеты и, возможно, другие, в зависимости от системы (хотя в случае с OP при резервном копировании файловой системы NTFS они вряд ли будут присутствовать).

Стефан Шазелас
источник
2

В zsh используйте спецификатор glob . для сопоставления только обычных файлов (не включая символические ссылки) и Dдля сопоставления файлов точек:

sudo chmod a-x folder\ with\ restored\ backup/**/*(D.)

Если командная строка слишком длинная, вы можете использовать zargs:

zargs -- folder\ with\ restored\ backup/**/*(D.) -- sudo chmod a-x 
Жиль "ТАК - перестань быть злым"
источник