Hice una copia de seguridad en un disco NTFS, y bueno, esta copia de seguridad realmente resultó necesaria. Sin embargo, la unidad NTFS estropeó los permisos. Me gustaría restaurarlos a la normalidad sin reparar manualmente todos y cada uno de los archivos.
Un problema es que de repente todos mis archivos de texto obtuvieron permisos de ejecución, lo cual es incorrecto. Entonces intenté:
sudo chmod -R a-x folder\ with\ restored\ backup/
Pero está mal, ya que también elimina el x
permiso de los directorios, lo que los hace ilegibles.
¿Cuál es el comando correcto en este caso?
permissions
executable
recursive
gaazkam
fuente
fuente
Respuestas:
Las
-x
quita permisos de ejecución para todosEl
+X
añadirán permisos de ejecución para todos, pero solamente para los directorios.fuente
chmod -R -x+x *
chmod -R -x * && chmod -R +X *
Ok, releí las páginas de manual "chmod" para Mac OS X, BSD y Linux, e hice algunos experimentos. Esto es lo que aprendí sobre los modos simbólicos. Puede complicarse, pero vale la pena entenderlo:
Entonces, por ejemplo,
a+x
haría un archivo ejecutable por todos.a+X
haría que un archivo fuera ejecutable por todos SI hubiera sido ejecutable por alguien.a+x
haría que todos pudieran buscar un directorio.a+X
también haría que todos pudieran buscar un directorio.La diferencia clave entre BSD y Linux es que con BSD, la determinación se realiza en función de los permisos del archivo antes de ejecutar chmod. Mientras que con Linux, la determinación se realiza inmediatamente antes de que se ejecute la cláusula + X.
Entonces, con BSD, la combinación
a-x,a+X
eliminaría el permiso de ejecución / búsqueda y luego haría que todos pudieran buscar un directorio, y haría que un archivo fuera ejecutable por todos si originalmente hubiera sido ejecutable por alguien.Con Linux,
a-x,a+X
eliminaría el permiso de ejecución / búsqueda y luego haría que todos pudieran buscar un directorio, mientras que nadie dejaría un archivo ejecutable.Aquí hay un ejemplo concreto: en una máquina BSD: un directorio, un archivo ejecutable y un archivo no ejecutable:
Observe que tanto el directorio como "fie" son ejecutables / buscables por el usuario, pero no por otros.
Ahora ejecutamos
chmod a-x,a+X *
. La primera cláusula eliminará el bit de ejecución / búsqueda de todos los usuarios para todos los archivos, pero la segunda cláusula lo agregará de nuevo para "tarifa" y "fie". "tarifa" porque es un directorio, y "fie" porque tenía al menos un bit ejecutable para empezar.Tuve el mismo resultado al ejecutar
chmod -x+X
.Conclusión: la solución de Jak Gibb funcionará en Linux, pero para BSD, necesitaría hacer dos pases.
No probé esto en SVr4 u otras variantes de Unix.
fuente
Una forma de hacerlo:
fuente
chmod a-x {}
chmod a-x {}
también podría terminar eliminando permisos que no desea cambiar, y podría dejar archivos que se pueden escribir en todo el mundo. El punto es que 0644 es un compromiso "generalmente razonable". El OP debería, por supuesto, también involucrar al cerebro antes de aplicar soluciones de Internet en su computadora.chmod
. Si los archivos de respaldo contienen scripts y binarios, eliminarlosx
es incorrecto. Si los permisos anterioreschmod
son 0777chmod a-x
, los dejará 0666, que probablemente no sea lo que desea. Lo que digo es quechmod 0644
es una mejor heurística, nochmod a-x
está mal.Eliminaría el permiso de ejecución a los archivos que no son de tipo directorio (como solicitó) ni enlace simbólico (los enlaces simbólicos generalmente siempre son rwxrwxrwx, y
chmod
afectarían el objetivo del enlace simbólico en ellos).Tenga en cuenta que:
solo cambiaría el permiso de los archivos normales . Eso excluiría directorios y enlaces simbólicos , pero también dispositivos , canalizaciones con nombre , enchufes y posiblemente otros según el sistema (aunque en el caso del OP de una copia de seguridad de un sistema de archivos NTFS, es poco probable que estén presentes).
fuente
En zsh, use el calificador glob
.
para hacer coincidir solo los archivos normales (sin incluir enlaces simbólicos) yD
para hacer coincidir los archivos de puntos:Si la línea de comando es demasiado larga, puede usar
zargs
:fuente