Como lidar com nomes de arquivos com espaços ao alterar as permissões de determinados arquivos no diretório atual e em todos os seus subdiretórios?

Como lidar com nomes de arquivos com espaços ao alterar as permissões de determinados arquivos no diretório atual e em todos os seus subdiretórios?

Atualmente, estou tentando definir todos os arquivos com extensões .htmlno 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 findsaí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 -execpredicado 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=rantes de -execpular os arquivos que já possuem (pelo menos) essas permissões.

Com osfindimplementação defind(que também é o findembutido deA boshconcha), você pode usar o -chmodpredicado 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 ( sfindchama 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 De. eliminatórias globaispara incluir respectivamente arquivos ocultos e restringir aregulararquivos (como -type ffaz). Adicione ^f[u+rw,go+r]também para ignorar arquivos que já possuem essas permissões.

Você não pode usar chmod's -Rpara 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 htmlarquivos para chmode 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 finde xargs. Leia man find xargse 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ê.

informação relacionada