У меня есть родительский каталог, в котором находится несколько приложений, каждое из которых имеет свои bin
подкаталоги.
parent
--app1
--bin
--(maybe some other bins on even lower level)
--app2
--bin
...
Я хочу добавить разрешение на исполнение для файлов внутри папки, bin
но не для самой папки.
Однако структура выше не является регулярной (поэтому я не могу просто использовать цикл, чтобы предсказать, что bin
на определенной глубине/уровне находится ).
Пока что у меня есть вот что:
find /parent -type d -iname "bin" -exec chmod -R a+x {} \;
Я знаю, что нет ничего плохого в том, чтобы применить chmod -R
это к каждому файлу bin
, но ради поиска более чистого способа я хочу применить это +x
только к файлам.
решение1
Необходимо разрешить x
для каталогов: просмотр каталога (и, следовательно, поиск файла в нем) — это то, что x
означает привилегия для каталога.
Тем не менее, используя
-exec chmod -R a+x {}/* \;
будет назначено x
только содержимому каталога, а не самому каталогу.
Если вы хотите обслужить вложенные bin
каталоги, используйте что-то вроде этого
while read F; do \
test -f "$F" || continue \
test $(basename $(dirname "$F")) == "bin" || continue \
chmod a+x "$F" \
done < find /path/to/base -type f
решение2
Существует несколько подходов:
Как сказал Eugen, +x в каталогах — это нормально, это даже требуется для доступа к содержимому. Если скрипты должны быть исполняемыми во всем мире, то имеет смысл продолжить ваш текущий метод и сделать каталоги также доступными для обхода во всем мире.
Вы можете положиться на расширенные подстановки bash для сбора всех
bin
каталогов на любой глубине:shopt -s globstar; find **/bin/ -type f -exec chmod a+x {} \;
То же самое, но без проверки типа:
shopt -s globstar; chmod -R a+x **/bin/
Используйте несколько
find
вызовов:find . -type d -name bin | while read -r path; do find "$path/" -type f -exec chmod a+x {} \; done
(Предполагается, что в именах ваших файлов нет переносов строк; если они есть, вам следует беспокоиться — и вам следует скорректировать пример для использования
-print0
и все такое.)К сожалению, вы не можете напрямую вкладываться
find -exec
в другойfind -exec
, но вы можете вызвать скрипт, который впоследствии вызывает find -exec:find . -type d -name bin -execdir sh -c "find . -type f -exec chmod a+x {} \;" \;
Это используется
-execdir
вместо ,-exec
чтобы избежать проблемного вложения {}.