
Eu tenho um script que estou executando para corrigir a propriedade e as permissões do arquivo após um rsync. Deixando de lado as questões sobre a maneira ideal de realizar minha tarefa, eu me pergunto: existe uma maneira de executar chmod
e chown
ao mesmo tempo?
Na iteração atual do meu script, estou find
acessando arquivos duas vezes.
find /var/www/mysite -exec chown www-data:www-data {} \;
find /var/www/mysite -type f -exec chmod 775 {} \;
Achei que seria bom se eu pudesse alterar as permissões e o proprietário/grupo com um único comando. Depois de pesquisar no Google, fiquei surpreso ao saber que tal comando, argumento ou opção não existe.
Posso alterar as permissões e a propriedade ao mesmo tempo, para evitar find
enviar cada arquivo duas vezes?
EditarUma edição ou postagem da comunidade ou algo sugeriu que esta pergunta é uma duplicata de"Altere todas as permissões de pasta com 1 comando". Esta questão é diferente porque pergunta sobre a mudançaambospermissõese propriedadeao mesmo tempo, não apenas permissões.
Responder1
Você pode passar vários comandos exec:
find /var/www/mysite -exec chown www-data:www-data {} \; \
-type f -exec chmod 775 {} \;
Responder2
Você pode adicionar as opções equivalentes ao seu rsync
comando:
rsync <your_options> --chown www-data:www-data --chmod=F775 <source> <destination>
Você pode usar prefixo F
para --chmod
arquivos e D
diretórios.
Responder3
Para completarxargstambém pode fazer todo tipo de coisas interessantes em pipelines.
find . -type f -print0 | xargs -0 -I VAR -- sh -c 'chmod 775 "VAR" && chown www-data:www-data "VAR" '
Isso produz um fluxo de nomes de arquivos (não nomes de diretórios) com valores nulos para separadores, portanto, lida com espaços em nomes de arquivos.
-0
diz ao xargs para separar as entradas no nulo.
-I VAR
diz para usar VAR
como o "nome da variável" em vez de {}
--
e tudo depois é o que executar para cada linha
Isso pode ser mais legível, mas iniciará um novo shell para cada execução do comando duplo.
Responder4
Se você está preocupado em find
executar cada arquivo duas vezes, também pode querer se preocupar com o número de bifurcações que a execução de uma combinação de comandos via xargs produziria.
As pessoas muitas vezes esquecem que o perl tem equivalentes para muitos desses comandos básicos do shell. Aqui está uma maneira de fazer isso (testado):
find | perl -lne 'chown 1001,1001, $_; -d $_ ? chmod(0755, $_) : chmod(0644, $_)'
Você teria que usar onuméricouid, gid e mode, mas pense nisso:isso não bifurca de jeito nenhum(além daquele find
e daquele perl
).
E você também não precisa saber muito perl para grocá-lo.
O chown e o chmod são bastante claros. -d
é o mesmo que no shell [
ou no test
comando, e o operador ternário foo ? bar : baz
não é exclusivo do perl. (Como bônus, você pode usar modos diferentes para diretórios e arquivos.)
Na verdade, são as opções que podem precisar de explicação se você for novo no Perl. Um pouco simplificado:
- o
-n
meio "executar isso uma vez para cada linha de STDIN, configurando$_
para a linha" -l
faz com que o avanço de linha no final de cada linha desapareça (caso contrário, isso se tornará parte de$_
)-e
é familiar para pessoas que sabemsed
; diz que esta é a expressão a ser avaliada/executada.