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