O modo recursivo funciona apenas em diretórios, não em arquivos. Usando o glob '* .pdf', o shell está passando a lista de arquivos para chown, que vê esses arquivos, e altera as permissões nos arquivos que vê, e é isso.
Lembre-se, nas conchas, a glob é avaliada pelo shell, não pelo comando. Se o glob corresponder aos arquivos, eles são passados para o comando e o comando nunca sabe que um glob existia. (É diferente de como o prompt de comando do Windows 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
O shell faria primeiro a lista: file1.pdf file2.pdf
e execute o seu comando:
chown -R someuser:somegroup file1.pdf file2.pdf
Veja, não há diretório para o -R atuar. Ele faz o que você pediu - altere a propriedade dos dois arquivos na linha de comando, ignorando o sinalizador -R peculiar.
Para fazer o que você deseja, use o '* .pdf' como padrão para este diretório e subdiretórios, você pode usar find
, que pode encontrar arquivos que correspondam a um padrão de nome de arquivo (ou muitos outros critérios) e passar para um subcomando
find . -type f -name '*.pdf' | xargs chown someuser:somegroup
Isso começa no diretório atual '.' procurar arquivos (tipo de arquivo f) do padrão de nome '*.pdf'
passa para xargs, que constrói uma linha de comando para chmod. Observe as aspas ao redor do padrão '*.pdf'
, lembre-se de que o shell criará um globo, se puder, mas você deseja que o padrão seja passado find
, então você precisa citá-lo.
Como os nomes de arquivos podem ter espaços, você deve usar um truque para torná-lo seguro com nome de arquivo com espaços:
find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup
No bash 3 e inferior, é dessa maneira que você precisa fazer isso. Globbing mais poderoso está disponível no bash 4 (com shopt -s globstar
) e em outros reservatórios. O mesmo no zsh, usando um globo recursivo **
:
chown -R someuser:somegroup ./**/*.pdf
shopt -s globstar
faz globbing recursivo.Isso aplicará chown a todos os arquivos e todos os subdiretórios e subdiretórios da pasta especificada. Use com cuidado.
fonte
sudo chown -R user ./
funcionou para mim, massudo chown -R user ./*
não o fez.env
.Você pode usar o
find
utilitário:Por favor, não esqueça as aspas
*.pdf
. Caso contrário, o shell tentará expandi-lo. Isso significa que o shell já será substituído*.pdf
pelos nomes de todos os arquivos PDF encontrados no diretório atual. Mas não é isso que você quer. Você deseja encontrar os arquivos PDF localizados em subdiretórios. Btw .: Esse também é o problema do seuchown
comando.fonte
+
truque puro para o desempenho.-exec command {} +
Essa variante da ação -exec executa o comando especificado nos arquivos selecionados, mas a linha de comandos é criada anexando cada nome de arquivo selecionado no final; o número total de invocações do comando será muito menor que o número de arquivos correspondentes. A linha de comando é construída da mesma maneira quexargs
cria suas linhas de comando. Apenas uma instância de{}
é permitida dentro do comando. O comando é executado no diretório inicial.O comando
somente recursará os diretórios se o nome do diretório terminar em .pdf. Você precisa de algo como:
fonte
Para alterar a propriedade de um diretório recursivamente, basta usar:
aqui nome de usuário = o novo usuário que deve ser o proprietário do diretório
groupname = o novo grupo que deve ser o proprietário do diretório
todo arquivo / diretório tem um proprietário de usuário e um proprietário de grupo
fonte
Eu uso em
tree
vez disso:Também tome cuidado para não executar chown recursivo ou chmod no diretório '/' ou em outro diretório do sistema.
fonte
Para se tornar o proprietário de todos os arquivos em um diretório, use
ao invés de
ou
que pode não funcionar se houver muitos argumentos produzidos por * (muitos arquivos no diretório) ou que não faz o que você deseja, respectivamente.
fonte