Предоставить разрешение на выполнение только для файлов в подкаталогах «bin»

Предоставить разрешение на выполнение только для файлов в подкаталогах «bin»

У меня есть родительский каталог, в котором находится несколько приложений, каждое из которых имеет свои 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чтобы избежать проблемного вложения {}.

Связанный контент