
Actualmente estoy intentando configurar todos los archivos con extensiones .html
en 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 find
salida 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 -exec
predicado 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=r
antes -exec
para omitir los archivos que ya tienen (al menos) esos permisos.
Con elsfind
implementación defind
(que también es la find
parte incorporada dela bosh
cáscara), puedes usar el -chmod
predicado 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 ( sfind
llama 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 D
y.
clasificatorios globalespara incluir respectivamente archivos ocultos y restringirlos aregulararchivos (como -type f
lo hace). Agregue ^f[u+rw,go+r]
para omitir también los archivos que ya tienen esos permisos.
No puedes usar chmod
's -R
para 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 html
archivos a chmod
y 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 find
y xargs
. Lea man find xargs
y 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.