Eu tenho um diretório pai que contém vários aplicativos, cada um com seus próprios bin
subdiretó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, bin
mas 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 bin
profundidade/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 -R
each bin
, mas para encontrar uma maneira mais limpa, quero aplicar +x
apenas nos arquivos.
Responder1
É necessário permitir x
nos diretórios: Listar um diretório (e assim encontrar um arquivo dentro dele) é o que o x
privilégio significa em um diretório.
Dito isto, usando
-exec chmod -R a+x {}/* \;
atribuirá x
apenas o conteúdo de um diretório, não o próprio diretório.
Se você quiser atender bin
diretó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
bin
os 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
find
chamadas: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
-print0
e tudo mais.)Infelizmente você não pode aninhar diretamente
find -exec
dentro de outrofind -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
-execdir
em vez de-exec
para evitar aninhamento {} problemático.