2011-03-22 16:29:12 +0000 2011-03-22 16:29:12 +0000
308
308

Como posso fazer o chown trabalhar de forma recorrente?

Tenho um directório chamado pdfs que contém um monte de subdirectórios e subdirectórios. Quero mudar a propriedade em todos os ficheiros PDF em todas as subpastas. Acabei de experimentar isto:

chown -R someuser:somegroup *.pdf

…mas não mudou a propriedade dos PDFs nas subdirectorias. O utilizador e o grupo existem.

De acordo com a página de manual para chown, o -R deve significar recursivo:

-R, --recursive
          operate on files and directories recursively

O que me falta?

Respostas (7)

315
315
315
2011-03-22 16:47:32 +0000

O modo recursivo só funciona em directórios e não em ficheiros. Ao utilizar o glob ‘*.pdf’ a shell passa a lista de ficheiros para chown, que vê estes são ficheiros, e altera as permissões nos ficheiros que vê, e pronto.

Lembre-se, em shells, o glob é avaliado pela shell, não pelo comando. Se o glob corresponder a ficheiros, eles são passados para o comando e o comando nunca sabe que um glob existiu. (Isto é diferente de como o Windows Command prompt costumava fazer as coisas). Se você tem um dir, com o conteúdo algo como:

machine:$ ls -F
file1.pdf file2.pdf other.txt subdir/

E você digitou:

chown -R someuser:somegroup *.pdf

A shell primeiro faria a lista: file1.pdf file2.pdf

e depois executaria o seu comando:

chown -R someuser:somegroup file1.pdf file2.pdf

Veja, não há nenhum directório para -R para agir. Ele faz o que você pediu - mudar de dono nos dois arquivos na linha de comando, ignorando aquela bandeira -R peculiar.

Para fazer o que você quer, use o ‘*. pdf’ como padrão para este directório e subdirectórios, pode usar o find, que pode encontrar ficheiros que correspondem a um padrão de nome de ficheiro (ou muitos outros critérios) e passar para um subcomando

find . -type f -name '*.pdf' | xargs chown someuser:somegroup

. Isto começa no dir ‘.’ actual para procurar ficheiros (tipo de ficheiro f) de padrão de nome '*.pdf' depois passa para xargs, que constrói uma linha de comando para chmod. Repare nas citações à volta do padrão '*.pdf', lembre-se que a shell irá criar um glob se puder, mas você quer que o padrão passe para find, por isso precisa de o citar.

Porque os nomes de ficheiros podem ter espaços, você quer usar um truque para o tornar seguro:

find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup

Em bash 3 e inferior, esta é a forma que precisa de o fazer. A globbing mais potente está disponível na bash 4 (com shopt -s globstar)e em outras conchas. O mesmo em zsh, usando um globo recursivo **:

chown -R someuser:somegroup ./**/*.pdf
57
57
57
2015-11-09 11:44:58 +0000
chown -R someuser:somegroup /your/folder/here/*

Isto aplicar-se-á a todos os ficheiros e a todas as subdirectorias e subdirectórios da pasta especificada. Use com cuidado.

14
14
14
2011-03-22 16:37:41 +0000

Pode utilizar o utilitário find:

find . -name '*.pdf' -exec chown someuser:somegroup {} +

Por favor não se esqueça das citações em torno do *.pdf. Caso contrário, a concha tentará expandi-la. Isto significa que já a shell irá substituir o *.pdf pelos nomes de todos os ficheiros PDF encontrados no directório actual. Mas não é isso que você quer. Você quer encontrar os ficheiros PDF localizados em subdirectórios. Btw..: Esse é também o problema com o seu comando chown.

6
6
6
2011-03-22 16:38:07 +0000

O comando

chown -R someuser:somegroup *.pdf

só voltará a aparecer nos directórios se o nome directório terminar em .pdf. Você precisa de algo como:

find . -name "*.pdf" -exec chown someuser:somegroup {} \;
1
1
1
2016-05-11 01:38:58 +0000

para alterar a propriedade de um directório de forma recorrente basta usar:

sudo chown -R <username>:<groupname> <dir name>

aqui username = o novo utilizador que deve ser proprietário do directório

groupname = o novo grupo que deve ser proprietário do directório

cada ficheiro/directório tem um utilizador proprietário e um grupo proprietário

0
0
0
2018-01-25 13:36:51 +0000

Eu uso tree em vez disso:

sudo tree -fai ~/.blabla | xargs -L1 -I{} sudo chown youruser:youruser {}

Também tomo cuidado para não correr recursivamente chown ou chmod no directório ‘/’ ou noutro directório do sistema.

0
0
0
2019-01-29 20:22:33 +0000

Para se tornar proprietário de todos os ficheiros de um directório, utilize

find directory -type f -name '*' | sudo xargs -d '\n' chown $USER

em vez de

sudo chown $USER directory\*

ou

sudo chown --recursive $USER directory

que podem não funcionar se houver demasiados argumentos produzidos por * (demasiados ficheiros no directório) ou que não fazem o que se pretende, respectivamente.