chmod e chown ao mesmo tempo?

chmod e chown ao mesmo tempo?

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 chmode chownao mesmo tempo?

Na iteração atual do meu script, estou findacessando 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 findenviar 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 rsynccomando:

rsync <your_options> --chown www-data:www-data --chmod=F775 <source> <destination>

Você pode usar prefixo Fpara --chmodarquivos e Ddiretó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.

-0diz ao xargs para separar as entradas no nulo.
-I VARdiz para usar VARcomo 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 findexecutar 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 finde 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 testcomando, e o operador ternário foo ? bar : baznã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 -nmeio "executar isso uma vez para cada linha de STDIN, configurando $_para a linha"
  • -lfaz 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 sabem sed; diz que esta é a expressão a ser avaliada/executada.

informação relacionada