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


4

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

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

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


Из любопытства, что именно ваша текущая команда не выполняет должным образом? -type fПредикат уже выбирает все файлы (или , что эквивалентно, все файлы без каталогов, так как ничего , что файл не может быть каталогом).
Дэвид Z

@David: Сокеты, FIFO, символические ссылки, устройства и т. Д.
Игнасио Васкес-Абрамс,

@Ignacio: Да, но вопрос был о файлах, а не обо всех других не файловых вещах.
Дэвид Z

@ Дэвид: это * nix. Все это файл.
Игнасио Васкес-Абрамс

1
@Ignacio: Конечно, у всего есть путь к файловой системе, но вы не всегда можете сказать, что на самом деле все является файлом. Некоторые люди делают, но другие используют «файл» в смысле обычного файла, то есть что-то, что будет соответствовать -type fпредикату find. Для меня формулировка этого вопроса настоятельно подсказала последнее значение.
Дэвид Z

Ответы:


4
find ... '!' -type d ...

Спасибо, я не понимал, что найти операторы. Нужны ли одинарные кавычки, так как мне удалось заставить их работать без них?
wting

1
Это зависит от вашей оболочки и ее параметров. bash использует !в расширении истории, поэтому цитирование в CLI - хорошая идея. Вы вероятно не будете нуждаться в этом в подлиннике все же.
Игнасио Васкес-Абрамс

Расширение истории не активно в скриптах, правильно.
Дениф
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.