Como chown / chmod todos os arquivos no diretório atual?

56

Estou tentando alterar a propriedade e as permissões de alguns arquivos (e diretórios) no diretório atual. Eu tentei isso:

chown username:groupname .

... esperando que isso afetasse todos os arquivos no diretório atual, mas afetasse apenas o diretório em que estou (o que é o oposto do que eu quero fazer). Quero alterá-lo em todos os arquivos sem afetar o diretório atual em que estou.

Como posso chown e chmod todos os arquivos no diretório atual?

Andrew
fonte
man chowne man chmodresponda facilmente à sua pergunta.
Shi
2
@ Shi eu acho que é uma pergunta justa. Ler essa página de manual não ajudaria. Globbing não faz parte chmod. Está embutido no shell. Também ler a documentação sobre globbing suga a vida de você (passei muito tempo descobrindo todos os recursos do zsh).
djf
11
@djf:chown -R user:group .
Shi

Respostas:

96

Você deseja usar chown username:groupname *e deixe o shell expandir *para o conteúdo do diretório atual. Isso alterará as permissões para todos os arquivos / pastas no diretório atual, mas não o conteúdo das pastas.

Você também pode fazer o chown -R username:groupname .que alteraria as permissões no diretório atual e, em seguida, recuaria dentro dele e de todas as subpastas para alterar as permissões.

chown -R username:groupname *alterará as permissões em todos os arquivos e pastas recursivamente, deixando o diretório atual sozinho. Esse estilo e o primeiro são o que eu me uso com mais frequência.

Darth Android
fonte
2
@ Andrew Fique atento, porém, ele pode ser amigo e inimigo dos cansados ​​ou despreparados.
Darth Android
5
Além disso, cuidado com os perigos do período. Como é colocado ao lado do teclado "/". Um simples erro de digitação pode facilmente se transformar chown -R username:groupname .em chown -R username:groupname /. Fazendo uma tarefa de 2 segundos um pesadelo de 2 dias.
Teynon # 9/16
@ Tom É por isso que eu provavelmente deveria começar a usar -vtodos os meus comandos recursivos, mas com preguiça #
Kolob Canyon
Apenas votado como o melhor e mais conciso analisador, embora eu seja específico e nomeie o diretório, apenas para evitar um deslize do teclado:chown -R username:groupname directoryname
Dave Everitt
9

Eu acho que você quer isso:

chown username:groupname *

Se você também deseja alterar recursivamente os subdiretórios, precisará da opção -R( -restá obsoleta):

chown -R username:groupname *

djf
fonte
0

chowné ótimo se você é um superusuário. Eu tive um problema em que outra pessoa havia executado makeno meu diretório e agora possuía alguns arquivos que não consegui modificar. Aqui está minha solução alternativa que lida com arquivos e diretórios, embora deixe os diretórios por aí com sufixo, .mkmeownerse não puder excluí-los.

  • O script a seguir altera a propriedade dos arquivos e diretórios passados ​​a ele para pertencer ao usuário atual, tentando solucionar problemas de permissão, fazendo uma nova cópia de cada diretório ou arquivo não pertencente ao usuário atual, excluindo (ou tentando excluir) o arquivo original e renomear adequadamente.
  • A intenção é que seja uma abreviação de "make me owner". Não uso sublinhados porque eles são difíceis de digitar.

Exemplos:

% mkmeowner .

% mkmeowner dirpath1 dirpath2
  • Requer que o seguinte script mkmeowneroneesteja no seu caminho.

mkmeowner:

#!/bin/bash
[ "x$1" == "x-h" ] || [ "x$1" == "x--help" ] && cat << END && exit 0
Usage: $0 dirorfile [direorfile2 ...]:
    change ownership of directories or files to current user.
    Current user must have permissions to read those and write to owner directory.
END
mkmeownerone=`which mkmeownerone`
for d in $*; do
    find "$d" -not -user `whoami` -exec $mkmeownerone {} \;
done

mkmeownerone:

#!/bin/bash
# change ownership of one file or directory
f="$1"
expr match "${f}" '.*\.mkmeowner$' > /dev/null && exit 1 # already tried to do this one
if mv -f "$f" "${f}.mkmeowner"; then
    cp -pr "${f}.mkmeowner" "$f" && rm -rf "${f}.mkmeowner"
    exit 0
fi
exit 1
sbcondor
fonte
11
(1) Preferimos respostas que incluam alguma explicação. Fui pego de surpresa quando li seus scripts e vi o que eles fizeram, porque seu parágrafo introdutório não me deu uma pista. (2) Você esqueceu de mencionar que o usuário deve colocar mkmeowneroneno CAMINHO de pesquisa.  mkmeownerexplodirá se isso não for feito. (3) Aprenda como (por exemplo, quando e onde) usar aspas nos comandos e scripts do shell. Dizer ${f}não é uma alternativa útil; veja isso . ... (continua)
Scott
(Continua)… (4) Se você executar o script em um diretório, ele potencialmente copiará todos os arquivos nesse diretório duas vezes. (5)  expré antiquado. É mais eficiente fazer uma correspondência simples de strings no shell; O bash também suporta correspondência de expressão regular. Nesse caso, você pode fazer o teste do nome do arquivo em find. (6) Seu expr matchcomando testa se ${f}termina com mkmeowner, não se termina com .mkmeowner. Portanto, o script não funcionará sozinho. ... (continua)
Scott
(Continua) ... Agora, sem dúvida, isso é uma coisa boa - você não quer se mover e potencialmente excluir um script enquanto estiver em execução. (Isso não necessariamente causa um problema, mas pode ser confuso.) Mas você deve entender (e documentar) casos especiais como esse. (7) Você pode usar sublinhados em seqüências de várias palavras.  dirorfileé difícil de ler e entender (comparar com dir_or_file) e, quando vi mkmeowner, meu primeiro pensamento foi em um gato ( mk +  meow +  ner).
Scott
Obrigado pelas notas Scott. 1. Eu pensei que tinha uma explicação, mas deixe-me ser mais explícito. 2. bom ponto. Eu havia capturado isso no meu roteiro original, mas retirei a referência. 3. Escrevo scripts de shell há 30 anos, mas com certeza, tentarei aprender mais. 4. Sim, sim. De propósito, porque se eu não possuo o diretório, não posso excluí-lo. Eu posso mencionar isso. 5. Sim, eu sou antiquado, mas expr ainda funciona muito bem 6. ha bom ponto. 7. Talvez eu consiga obter alguma licença artística, pois sublinhados não são uma regra. Eu preciso de um script que faça miados!
sbcondor 15/03
Eu não acho que haja algo errado com $ {f}, certo? É apenas um pouco mais do que o necessário. É um formato que eu uso com frequência porque posso usar uma variável para criar uma string mais longa como $ {f} .mkmeowner, e não preciso me lembrar se $ f.heck significa $ {f} + heck ou $ { f.heck}
sbcondor 15/03