Eu posso estar faltando alguma coisa, mas isso parece simples:
$ cd /var/www/html
$ for dir in *
do
chown -R "$dir:$dir" "$dir"
done
Se você estiver preocupado com a exatidão desses comandos,
você pode inserir a palavra echo
antes de chown
, por exemplo,
$ cd /var/www/html $ for dir in * do echo chown -R "$dir:$dir" "$dir" done
para que ele diga quais comandos chown
ele fará,
sem realmente fazê-las.
Este truque se aplica ao longo desta resposta,
e, de fato, para a maioria das soluções de script de shell (ou seja, para outras questões).
Se você quiser fazer isso em uma linha,
$ cd /var/www/html && for d in *; do chown -R "$d:$d" "$d"; done
Eu fiz o cd
para evitar a complexidade que a outra resposta
abraçado.
Se você fizer
$ for dir in /var/www/html/*
então dir
será definido como /var/www/html/domain1
,
/var/www/html/domain2
, /var/www/html/domain3
, etc.
o que é bom para manipular os diretórios,
mas não fornece os nomes de usuário e grupo necessários para chown
.
A outra resposta usa um pouco complicado (e não totalmente confiável)
procedimento awk
para separar o último nível do caminho do diretório
(ou seja, o nome do diretório, que também é o nome de usuário; por exemplo, domain1
)
do resto do caminho.
Felizmente, podemos fazer o equivalente (mas um pouco melhor)
inteiramente no shell, assim:
$ for dir in /var/www/html/*
do
owner="${dir##*/}"
chown -R "$owner:$owner" "$dir"
done
O ${dir##*/}
é uma forma especial de expansão de parâmetros
que leva o valor de $dir
e remove tudo por meio
(e incluindo) o último caractere /
(barra).
Isso, é claro, deixa apenas o diretório base nome , ou seja, o nome do usuário,
então, atribuímos isso a owner
e o usamos no comando chown
.
Tenha em atenção que este código é compatível com POSIX
e deve funcionar em qualquer shell compatível com POSIX;
ao contrário de algumas das respostas neste site, não depende do bash.
Se você quiser fazer isso em uma linha,
$ for d in /var/www/html/*; do o="${d##*/}"; chown -R "$o:$o" "$d"; done
Claro, se sua preocupação é apenas isso você não quer que o diretório de trabalho do seu shell principal seja alterado, então você pode apenas fazer o primeiro comando em um subshell:
$ (cd /var/www/html && for d in *; do chown -R "$d:$d" "$d"; done)
Não é preciso dizer (mas vou dizer mesmo assim)
que isso requer que você tenha usuários (e grupos)
chamado domain1
, domain2
, domain3
, etc., definido
antes de executar qualquer um desses comandos.
Se você tiver um script para adicionar um novo site,
é simples adicionar um comando para criar um novo usuário
sempre que você criar um novo diretório, antes de executar chown
.
Se você executar chown
com um nome que não seja um nome de usuário definido,
você receberá uma mensagem de erro invalid user
.