Extraer archivos y carpetas con permisos especificados

11

Empaquete una carpeta con muchas subcarpetas y archivos en Windows con 7zip, subo a VPS y luego ejecuto el comando:

tar -xvzf file.tar.gz

entonces todos los archivos y carpetas desempaquetados tienen permisos de 777. ¿Cómo lo consigo para que las carpetas tengan permisos de 755 y los archivos 644?

Kaspar L. Palgi
fuente
Hay un sitio web llamado "Command Line Fu" que tiene muchas otras ideas también.
djangofan

Respuestas:

13

Si se está ejecutando tar(1)como un usuario normal, aplicará su umaskde forma predeterminada. Si está ejecutando tar(1)como root, entonces puede dar la --no-same-permissionsopción de línea de comando para pedir tar(1)respetar umask.

Entonces: ejecute esto como un usuario normal:

umask 022
tar zxvf file.tar.gz

o ejecutar esto como root:

umask 022
tar zxvf file.tar.gz --no-same-permissions

Es posible que desee para pegar umask 022en su ~/.bashrc, ~/.bash_profileo ~/.profile. (Consulte la página de bash(1)manual para obtener detalles completos sobre los archivos de inicio. Es complicado).

Los detalles umaskse pueden encontrar en la página de manual de su shell, en la página umask(2)de manual de llamadas al sistema o en la página de umask(1posix)manual de utilidades proporcionada por POSIX (si tiene la manpages-posixinstalada).

sarnold
fuente
umask 022 tar zxvf file.tar.gz -> esto me pide confirmación para cada archivo por separado si quiero extraerlo
¿Sobreescribe los archivos existentes al hacerlo?
sarnold
6

Ejecute los siguientes comandos en la raíz del directorio para establecer los permisos deseados para sus directorios y archivos:

find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;

Tenga en cuenta el espacio entre el corchete de cierre y la barra oblicua

alxbrd
fuente
find: falta un argumento para `-exec '
¿Alguna idea de por qué este comando me dice "find: falta un argumento para` -exec '"? Gracias.
Agregue un espacio entre el corchete de cierre y el\;
poussma
2

Si usa X mayúscula chmod, puede usarlo para establecer los permisos de ejecución solo en los directorios. es decir

chmod -R ugo+X .
Stephen Quan
fuente
1

Encontré esta solución que funcionó para mí. Para carpetas y subcarpetas:

chmod -R 777 */

Y para todos los archivos (también en carpetas y subcarpetas):

find . -type f -name "*" | xargs chmod 644

Todos los comentarios son bienvenidos si esta no es una buena manera de hacerlo. Acabo de empezar a aprender Linux.

Después de los comentarios, una solución más robusta que maneja bien los caracteres especiales sería:

find . -type f -print0 | xargs -0 chmod 644  # For files
find . -type d -print0 | xargs -0 chmod 755  # For directories
Kaspar L. Palgi
fuente
Pero el segundo comando me da en muchos archivos esta salida: chmod: no puede acceder a the': No such file or directory chmod: cannot access Logo.txt ': No existe tal archivo o directorio chmod: no puede acceder a `./blog/wp-content/themes/OneRoom/LOGO': No existe dicho archivo o di
2
777es peligroso y solo se aplica a una minoría muy pequeña de sistemas.
sarnold
2
Para mejorar su segundo comando, find . -type f -print0 | xargs -0 chmod 644. No -name "*"es necesario, y xargs(1)analizará los nombres de archivo en espacios o líneas nuevas a menos que use el -0- que analiza los nombres de archivo en NULcaracteres ASCII , que no pueden aparecer en los nombres de archivo. El -print0por find(1)lo pide para dar formato a su salida en un modo adecuado para la xargs -0entrada.
sarnold
0

encontrar . -tipo f -exec chmod 644 {} \;

Hammed
fuente
2
Bienvenido a Superuser, tenga en cuenta que las respuestas de 1 línea rara vez se aceptan, ¿puede dar más detalles sobre su respuesta?
50-3