
Atualmente, estou tentando definir todos os arquivos com extensões .html
no diretório atual e todos os seus subdiretórios para serem legíveis e graváveis , e executáveis por seu proprietário e somente legíveis (não graváveis ou executáveis) por grupos e outros. No entanto, alguns dos arquivos possuem espaços em seus nomes, com os quais não tenho certeza de como lidar.
Minha primeira tentativa:
chmod -Rv u+rw,go+r '* *.html'
Quando tentei minha primeira tentativa, recebi a seguinte mensagem:
chmod: cannot access '* *.html': No such file or directory
failed to change mode of '* *.html' from 0000 (---------) to 0000 (---------)
Minha segunda tentativa:
find . -type f -name "* *.html" | chmod -Rv u+rw,go+r
Adicionei um operador de pipe para enviar a find
saída do comando para chmod
. No entanto, quando tentei minha segunda tentativa, recebi o seguinte:
chmod: missing operand after ‘u+rw,go+r’
Após minhas tentativas, ainda estou confuso sobre como lidar com espaços em nomes de arquivos para alterar as permissões definidas recursivamente. Qual é a melhor maneira de lidar com esse problema? Qualquer feedback ou sugestão é apreciado.
Responder1
Use o -exec
predicado de find
:
find . -name '* *.html' -type f -exec chmod -v u+rw,go+r {} +
(aqui, adicionar rw-r--r--
permissões apenas porque não faz sentido adicionar permissões de execução a um arquivo html, pois geralmente não devem ser executadas. Substitua +
por =
paradefinirexatamente essas permissões em vez deadicionandoesses bits para as permissões atuais).
Você também pode adicionar um ! -perm -u=rw,go=r
antes de -exec
pular os arquivos que já possuem (pelo menos) essas permissões.
Com osfind
implementação defind
(que também é o find
embutido deA bosh
concha), você pode usar o -chmod
predicado seguido por -chfile
(que aplica as alterações):
sfind . -name '* *.html' -type f -chmod u+rw,go+r -chfile
(lá, não há necessidade de adicionar o as ! -perm...
já ignora os arquivos que já possuem as permissões corretas).sfind
-chfile
Esse é o mais eficiente porque não envolve a execução de um chmod
comando separado em um novo processo para cada tantos arquivos, mas também porque evita procurar o caminho completo de cada arquivo duas vezes ( sfind
chama a chmod()
chamada do sistema com os caminhos dos arquivos em relação aos diretórios sfind
os encontra durante o rastreamento, o que significa chmod()
que não é necessário procurar novamente todos os componentes dos caminhos que levam a eles).
Com zsh
:
chmod -v -- u+rw,go+r **/*' '*.html(D.)
Aqui, usando o globbing recursivo do shell e o D
e.
eliminatórias globaispara incluir respectivamente arquivos ocultos e restringir aregulararquivos (como -type f
faz). Adicione ^f[u+rw,go+r]
também para ignorar arquivos que já possuem essas permissões.
Você não pode usar chmod
's -R
para isso em combinação com globs. Globs são expandidos pelo shell, não correspondidos por chmod
, portanto, com chmod -Rv ... *' '*.html
(observe que eles *
devem ser deixados sem aspas para que o shell os interprete como operadores globbing), você apenas passaria uma lista de html
arquivos para chmod
e somente se algum desses arquivos fosse diretórios iriam chmod recorrer a eles e alterar as permissões de todos os arquivos neles contidos.
Responder2
"Nomes de arquivos com espaços" exige find
e xargs
. Leia man find xargs
e faça algo como:
find . -type f -name '*.html' -print0 | \
xargs -0 -r echo chmod u=rwx,g=r,o
Remova " echo
" quando funcionar para você.