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

4

Мне нужно убрать исполняемый флаг из всех файлов в определенном каталоге и подкаталогах. Прямо сейчас я делаю это с двухэтапным процессом

find /dir/ -type f -exec chmod ugo-x {} \;
find /dir/ -type d -exec chmod ugo+rx {} \;

Можно ли изменить первую строку, чтобы я мог удалить флаг exec из всех файлов, не входящих в каталог? Поскольку это необходимо делать на регулярной основе во многих каталогах и файлах, я бы предпочел не использовать bash-скрипт, который замедлял бы его.

wting
источник
Из любопытства, что именно ваша текущая команда не выполняет должным образом? -type fПредикат уже выбирает все файлы (или , что эквивалентно, все файлы без каталогов, так как ничего , что файл не может быть каталогом).
Дэвид Z
@David: Сокеты, FIFO, символические ссылки, устройства и т. Д.
Игнасио Васкес-Абрамс,
@Ignacio: Да, но вопрос был о файлах, а не обо всех других не файловых вещах.
Дэвид Z
@ Дэвид: это * nix. Все это файл.
Игнасио Васкес-Абрамс
1
@Ignacio: Конечно, у всего есть путь к файловой системе, но вы не всегда можете сказать, что на самом деле все является файлом. Некоторые люди делают, но другие используют «файл» в смысле обычного файла, то есть что-то, что будет соответствовать -type fпредикату find. Для меня формулировка этого вопроса настоятельно подсказала последнее значение.
Дэвид Z

Ответы:

4
find ... '!' -type d ...
Игнасио Васкес-Абрамс
источник
Спасибо, я не понимал, что найти операторы. Нужны ли одинарные кавычки, так как мне удалось заставить их работать без них?
wting
1
Это зависит от вашей оболочки и ее параметров. bash использует !в расширении истории, поэтому цитирование в CLI - хорошая идея. Вы вероятно не будете нуждаться в этом в подлиннике все же.
Игнасио Васкес-Абрамс
Расширение истории не активно в скриптах, правильно.
Дениф