¿Cómo manejo los nombres de archivos con espacios al cambiar los permisos para ciertos archivos en el directorio actual y todos sus subdirectorios?

¿Cómo manejo los nombres de archivos con espacios al cambiar los permisos para ciertos archivos en el directorio actual y todos sus subdirectorios?

Actualmente estoy intentando configurar todos los archivos con extensiones .htmlen el directorio actual y todos sus subdirectorios para que sean legibles y escribibles , y ejecutables por su propietario y solo legibles (no escribibles ni ejecutables) por grupos y otros. Sin embargo, algunos de los archivos tienen espacios en su nombre, lo que no estoy seguro de cómo solucionar.

Mi primer intento:

chmod -Rv u+rw,go+r '* *.html'

Cuando intenté mi primer intento, aparece el siguiente mensaje:

chmod: cannot access '* *.html': No such file or directory
failed to change mode of '* *.html' from 0000 (---------) to 0000 (---------)

Mi segundo intento:

find . -type f -name "* *.html" | chmod -Rv u+rw,go+r

Agregué un operador de tubería para enviar la findsalida del comando a chmod. Sin embargo, cuando intenté mi segundo intento, obtengo lo siguiente:

chmod: missing operand after ‘u+rw,go+r’

Después de mis intentos, todavía estoy confundido sobre cómo manejar los espacios en los nombres de los archivos para cambiar los permisos establecidos de forma recursiva. ¿Cuál es la mejor manera de abordar este problema? Se agradece cualquier comentario o sugerencia.

Respuesta1

Utilice el -execpredicado de find:

find . -name '* *.html' -type f -exec chmod -v u+rw,go+r {} +

(aquí, agregar rw-r--r--permisos solo porque tiene poco sentido agregar permisos de ejecución a un archivo html, ya que generalmente no están destinados a ejecutarse. Reemplazar +con= acolocaresos permisos exactamente en lugar deagregandoesos bits a los permisos actuales).

También puede agregar un ! -perm -u=rw,go=rantes -execpara omitir los archivos que ya tienen (al menos) esos permisos.

Con elsfindimplementación defind(que también es la findparte incorporada dela boshcáscara), puedes usar el -chmodpredicado seguido de -chfile(que aplica los cambios):

sfind . -name '* *.html' -type f -chmod u+rw,go+r -chfile

(allí, no es necesario agregar el as ! -perm...ya omite los archivos que ya tienen los permisos correctos).sfind-chfile

Ese es el más eficiente porque no implica ejecutar un chmod comando separado en un nuevo proceso para cada tantos archivos, sino también porque evita buscar la ruta completa de cada archivo dos veces ( sfindllama chmod()a la llamada del sistema con las rutas de los archivos). relativo a los directorios sfind los encuentra durante el rastreo, lo que significa chmod()que no necesita buscar todos los componentes de las rutas que conducen a ellos nuevamente).

Con zsh:

chmod -v -- u+rw,go+r **/*' '*.html(D.)

Aquí usando el globbing recursivo del shell y el Dy. clasificatorios globalespara incluir respectivamente archivos ocultos y restringirlos aregulararchivos (como -type flo hace). Agregue ^f[u+rw,go+r]para omitir también los archivos que ya tienen esos permisos.

No puedes usar chmod's -Rpara eso en combinación con globos. Los globos se expanden mediante el shell, no coinciden con chmod, por lo que con chmod -Rv ... *' '*.html(tenga en cuenta que *deben dejarse sin comillas para que el shell los interprete como operadores globales), simplemente pasaría una lista de htmlarchivos a chmody solo si alguno de esos archivos estuviera Los directorios chmod recurrirían a ellos y cambiarían los permisos de todos los archivos allí.

Respuesta2

"Nombres de archivos con espacios" requiere findy xargs. Lea man find xargsy haga algo como:

find . -type f -name '*.html' -print0 | \
    xargs -0 -r echo chmod u=rwx,g=r,o

Elimine " echo" cuando funcione para usted.

información relacionada