Conceda permissão de execução apenas em arquivos nos subdiretórios “bin”

Conceda permissão de execução apenas em arquivos nos subdiretórios “bin”

Eu tenho um diretório pai que contém vários aplicativos, cada um com seus próprios binsubdiretórios

parent
--app1
  --bin
  --(maybe some other bins on even lower level)
--app2
  --bin
...

O que eu quero fazer é adicionar uma permissão executável nos arquivos, binmas não na pasta em si.

A estrutura acima não é regular (então não posso simplesmente usar um loop para prever que existe uma binprofundidade/nível específico).

Até agora o que tenho é isto:

find /parent -type d -iname "bin" -exec chmod -R a+x {} \;

Eu sei que não há mal nenhum em fazer chmod -Reach bin, mas para encontrar uma maneira mais limpa, quero aplicar +xapenas nos arquivos.

Responder1

É necessário permitir xnos diretórios: Listar um diretório (e assim encontrar um arquivo dentro dele) é o que o xprivilégio significa em um diretório.

Dito isto, usando

-exec chmod -R a+x {}/* \;

atribuirá xapenas o conteúdo de um diretório, não o próprio diretório.

Se você quiser atender bindiretórios aninhados, use algo como

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

Responder2

Existem várias abordagens:

  • Como Eugen mencionou, +x nos diretórios é normal – é até necessário para acessar o conteúdo. Se os scripts devem ser executáveis ​​mundialmente, faz sentido continuar com seu método atual e tornar os diretórios percorríveis mundialmente também.

  • Você pode contar com os globs estendidos do bash para coletar todos binos diretórios em qualquer profundidade:

    shopt -s globstar; find **/bin/ -type f -exec chmod a+x {} \;
    

    O mesmo, mas sem verificação de tipo:

    shopt -s globstar; chmod -R a+x **/bin/
    
  • Use várias findchamadas:

    find . -type d -name bin | while read -r path; do
        find "$path/" -type f -exec chmod a+x {} \;
    done
    

    (Isso pressupõe que seus nomes de arquivos não tenham quebras de linha; se tiverem, você deve se preocupar – e deve ajustar o exemplo a ser usado -print0e tudo mais.)

  • Infelizmente você não pode aninhar diretamente find -execdentro de outro find -exec, mas pode chamar um script que posteriormente chama find -exec:

    find . -type d -name bin -execdir sh -c "find . -type f -exec chmod a+x {} \;" \;
    

    Isso é usado -execdirem vez de -execpara evitar aninhamento {} problemático.

informação relacionada