Você precisa definir a variável IFS
como $(echo -en "\n\b")
, por exemplo:
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
find . -group groupname -exec sh -c 'su -c "chmod -R u+w,g-w,o-w,g+r,o+r ." - groupname {}' \;
IFS=$SAVEIFS
Eu tenho a necessidade de chmod arquivos que estão em um determinado grupo. Eu criei este constructo:
find . -group groupname -exec sh -c 'su -c "chmod -R u+w,g-w,o-w,g+r,o+r ." - groupname {}' \;
Isso funciona, mas falha quando o nome do arquivo tem um colchete (ou) nele.
Alguma idéia?
A maneira como você está usando a {}
interpolação deixa o nome do arquivo sem aspas, por isso é um pouco como executar chmod u=rw some(filename).txt
, que falhará da maneira que você descreveu.
Uma solução é mover {}
de uma string entre aspas para que find
possa manipulá-la corretamente.
Outro problema é que você parece estar dividindo o comando chmod
, com parte dele dentro do su
e parte dele fora. (Demonstre isso substituindo sh
por echo
.) O resultado é um comando quebrado e não tenho certeza do que você está tentando alcançar.
Tente isso (remova o echo
quando tiver certeza de que está fazendo o que deseja):
su -c "
find . -group groupname -exec echo chmod -R u+w,go+r,go-w {} \;
"
Você realmente pretende aplicar um chmod
recursivo a cada diretório que tenha o grupo groupname
? Talvez você deva considerar -type d
no conjunto de predicados.