Copie permisos de archivo, pero no archivos en Unix


14

(De: /programming/15245144/copy-file-permissions-but-not-files , cerrado porque fuera de tema)

Tengo dos copias del mismo árbol de directorios. Casi tienen los mismos archivos en ambos (una versión puede tener un par de archivos adicionales o faltantes). Sin embargo, la mayoría de los archivos son comunes a ambos directorios (tienen las mismas rutas relativas y todo).

Suponga que estos están en directorios:

version1/
version2/

El problema es que los permisos en la versión 1 / se equivocaron, y me gustaría copiar los permisos de la versión 2 /, pero hacerlo sin reemplazar los archivos en la versión 1 / que son más nuevos.

¿Existe una manera automatizada de hacer esto a través de comandos de shell o scripts?


Aquí hay un script útil en Perl que puede usar serverfault.com/questions/373058/…
NoNoNo

Respuestas:


15

GNU cp conoce la --attributes-onlybandera desde coreutils 8.6

- solo atributos no copia los datos del archivo, solo los atributos


1
Mi versión no parece tener esa bandera, y algunas publicaciones parecen tener advertencias atemorizantes, por ejemplo.
shearn89

14

Mi versión de cpno tiene la --attributes-onlybandera, así que elaboré esto. Probado brevemente en carpetas simples, YMMV.

$> ls
version1/
version2/
$> ls -l version1/1/a
-rw-rw-r-- 1 alex alex 0 Feb  5 12:49 version1/1/a
$> ls -l version2/1/a
-rwxrwxrwx 1 alex alex 0 Feb  5 12:49 version1/1/a

$> find version1 -type f -printf '%P\n' | xargs -I {} \
    chmod --reference=version1/{} version2/{}

$> ls -l version2/1/a
-rw-rw-r-- 1 alex alex 0 Feb  5 12:49 version1/1/a

5

¡Puedes, pero no pienso de forma "automatizada"!

GNU chown y GNU chmod tienen un --reference=RFILEparámetro que puede usar.

chown --reference=RFILE yourfile
chmod --reference=RFILE yourfile

Utiliza RFILEconfiguraciones (permisos, propietario, grupo, etc.) y las copia yourfile.

El manual explica con más detalle.


0

En mi caso, resolví usando el comando "stat" con "find" y "vi" para crear un script que aplique permisos.

cd version1/
find . -exec stat -c '%a %n' "{}" \; > setPerm.sh
vi setPerm.sh

En "vi" inserté en todas las líneas el comando "chmod": %s/^/chmod /g copié el script en el version2/directorio y lo ejecuté.

Otras soluciones parecen válidas pero no las probé por si acaso.


0

Inspirado por la respuesta de Mariano Paniga, creo que tengo una mejor, que no necesita vi y buscar / reemplazar comandos. Incluso quiero copiar la información de propiedad también (uid / gid).

cd version1/
find . -exec stat -c 'chmod %a %n; chown %U:%G %n' "{}" \; > /tmp/setPerm.sh
chmod u+x /tmp/setPerm.sh
cd ../version2
/tmp/setPerm.sh

Puede personalizar los comandos dentro de stat -c '...'lo que desee. Para todas las opciones disponibles, ver man stat.


¿Su script maneja nombres con líneas nuevas incrustadas?
Deer Hunter

@ deer-hunter Debería funcionar tal cual, si no, puede agregar una cita ".." alrededor de la parte del nombre del archivo.
Tomofumi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.