A maneira mais fácil de chown o conteúdo de um diretório?

3

Eu geralmente uso

ls -ld .
# remember current user and group
chown -R user.group .
chown remembered_user.remembered_group .

Não há uma maneira mais fácil de checar recursivamente todos os arquivos e diretórios em um diretório, mas não no próprio diretório? Ele deve incluir arquivos ocultos e funcionar, não importa quantos arquivos haja.

    
por AndreKR 10.04.2014 / 04:10

6 respostas

4

Você pode usar find para evitar que a lista de argumentos seja muito longa, enquanto ainda passa tantos argumentos para chown de uma só vez quanto possível (usando + em vez de ; ). -prune permite que você remova alguns argumentos desnecessários para chown (ele não desce diretórios, apenas usará chown -R neles):

find . \! -iname . -prune -exec chown -R user:group {} +
    
por 10.04.2014 / 05:36
1

Você pode usar o seguinte:

find . -mindepth 1 -print0 | xargs -0 chown user:group

Edit: O problema com o exemplo acima é que você está operando na pasta atual (.). A seção mindepth do meu exemplo exclui a pasta atual da lista de arquivos / diretórios que serão modificados.

Print0 altera a saída find a ser terminada em null, e xargs opera em cada linha (ou string terminada em null, com -0) e executa o comando especificado com sua entrada no final (nesse caso, cada nome de arquivo ). Você poderia alterar o comando xargs para ser mais explícito assim:

xargs -0I {} chown user:group {}

Dessa forma, você pode colocar a saída do find em qualquer lugar que desejar em seu comando. Espero que isso ajude.

    
por 10.04.2014 / 04:22
1

Por que não apenas executar chown dentro do diretório recursivamente?

$ chown -R user.group *

Exemplo

. diretório antes.

$ ll
total 20
drwxrwxr-x. 2 saml saml 4096 Apr  9 22:30 dir1
drwxrwxr-x. 2 saml saml 4096 Apr  9 22:30 dir2
drwxrwxr-x. 2 saml saml 4096 Apr  9 22:30 dir3
drwxrwxr-x. 2 saml saml 4096 Apr  9 22:30 dir4
drwxrwxr-x. 2 saml saml 4096 Apr  9 22:30 dir5

Altere apenas o conteúdo da dir.

$ chown -R saml.wheel *

Conteúdo depois.

$ ll
total 20
drwxrwxr-x. 2 saml wheel 4096 Apr  9 22:30 dir1
drwxrwxr-x. 2 saml wheel 4096 Apr  9 22:30 dir2
drwxrwxr-x. 2 saml wheel 4096 Apr  9 22:30 dir3
drwxrwxr-x. 2 saml wheel 4096 Apr  9 22:30 dir4
drwxrwxr-x. 2 saml wheel 4096 Apr  9 22:30 dir5

Enquanto isso, o diretório . é deixado intacto.

$ ls -ld .
drwxrwxr-x. 7 saml saml 4096 Apr  9 22:29 .

Se houver arquivos ocultos, configure seu shell para incluí-los no glob: shopt -s dotglob no bash, FIGNORE='@(.|..)' no ksh93, setopt dot_glob no zsh.

Como alternativa, adicione um padrão que corresponda a eles (tenha cuidado com shells que não sejam zsh, .* corresponderia a . e .. ):

chown -R saml.wheel * .[!.]* ..?*

Ou em zsh, simplesmente

chown -R saml.wheel *(D)
    
por 10.04.2014 / 04:32
0

No zsh:

chown user:group **/*(D)

O qualificador de glob D significa que os arquivos de ponto serão correspondidos.

Você pode fazer chown fazer a travessia recursiva em vez do shell:

chown -R user:group *(D)

Se você está preocupado que há tantos arquivos que a linha de comando será muito longa, carregue o chown builtin do arquivos / zsh módulo .

zmodload zsh/files
chown user:group **/*(D)

Se você não quiser que chown se refira ao builtin, só poderá carregar os nomes zf_* :

zmodload -Fm zsh/files b:zf_\*
zf_chown user:group **/*(D)

Quando você precisa chamar um comando externo (que não é o caso aqui) em uma longa lista de arquivos que podem não caber no limite da linha de comando, você pode usar o zargs :

autoload -U zargs
zargs -- **/*(D) -- chown user:group --
    
por 11.04.2014 / 02:15
0

A resposta de Chris Down ainda pode falhar se houver muitos arquivos no primeiro diretório.

find . \! -iname . -exec chown user:group {} \;

Na maioria dos casos, a resposta de Chris Down provavelmente não falhará e provavelmente será mais rápida do que essa resposta, mas eu queria responder à sua pergunta exatamente como você pediu.

Além disso, aqui está um comando ligeiramente diferente que funcionou melhor no meu caso. Não gosto de alterar diretórios em meus scripts, então escrevi o comando assim:

find /foo/bar/baz \! -samefile /foo/bar/baz -exec chown user:group {} \;
    
por 05.08.2018 / 18:30
-1

A seguir, o comando para alterar a propriedade dos diretórios e suas sub-pastas e todos os arquivos nele de forma recursiva.

$ chown -R <username> <folder_to_change_ownership>

Etapa 1: Encontre o nome de usuário executando o seguinte comando

$ whoami

isto produzirá o nome de usuário (seu nome de usuário será o que você definiu)

manojselvin

Etapa 2: Copie o nome de usuário da etapa anterior e substitua o comando da seguinte forma

$ chown -R manojselvin myfolder

este comando irá alterar a propriedade de todos os diretórios e subdiretórios para o nome de usuário mencionado. Neste caso é "manojselvin"

Etapa 3: Para verificar se a propriedade foi alterada, execute o seguinte comando, onde o diretório está localizado, por exemplo. myfolder neste caso.

$ ls -la

isto mostrará os detalhes do proprietário dos diretórios conforme abaixo

drwxr-xr-x  2 manojselvin manojselvin 4096 Jun 18 16:00 myfolder

Como você pode ver, a propriedade é agora "manojselvin", que é o nome de usuário que usamos neste caso. para outros, exibirá seu nome de usuário ou nome de grupo que foi definido

    
por 18.06.2018 / 12:34

Tags