Copiez les autorisations de fichier, mais pas les fichiers sous Unix

14

(De: /programming/15245144/copy-file-permissions-but-not-files , fermé car hors sujet)

J'ai deux copies de la même arborescence de répertoires. Ils ont presque les mêmes fichiers dans les deux (une version peut avoir quelques fichiers supplémentaires ou manquants). Cependant, la plupart des fichiers sont communs aux deux répertoires (ont les mêmes chemins d'accès relatifs et tout).

Supposons que ceux-ci se trouvent dans des répertoires:

version1/
version2/

Le problème est que les autorisations de la version1 / ont été gâchées, et je voudrais copier les autorisations de la version2 /, mais faites-le sans remplacer les fichiers de la version1 / qui sont plus récents.

Existe-t-il un moyen automatisé de le faire via des commandes shell ou des scripts?

Mariano Paniga
la source
Ici, il y a un script utile en perl que vous pouvez utiliser serverfault.com/questions/373058/…
NoNoNo

Réponses:

15

GNU cp connaît le --attributes-onlydrapeau depuis coreutils 8.6

--attributes-only ne copiez pas les données du fichier, juste les attributs

Tom Aac
la source
1
Ma version ne semble pas avoir ce drapeau, et certains articles semblent avoir des avertissements effrayants par exemple.
shearn89
14

Ma version de cpn'a pas le --attributes-onlydrapeau, j'ai donc travaillé dessus. Brièvement testé sur des dossiers 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
shearn89
la source
5

Vous pouvez, mais je ne pense pas de manière "automatisée"!

GNU chown et GNU chmod ont un --reference=RFILEparamètre que vous pouvez utiliser.

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

Il utilise des RFILEparamètres (autorisations, propriétaire, groupe, etc.) et les copie dans yourfile.

le manuel explique plus en détail.

Feiticeir0
la source
0

Dans mon cas, j'ai résolu en utilisant la commande "stat" avec "find" et "vi" pour créer un script qui applique les autorisations.

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

Dans "vi" j'ai inséré dans toutes les lignes la commande "chmod": %s/^/chmod /g j'ai copié le script dans le version2/répertoire et l' ai exécuté.

D'autres solutions semblent valables mais je ne les ai pas testées au cas où.

Mariano Paniga
la source
0

Inspiré par la réponse de Mariano Paniga, je pense que j'en ai une meilleure, qui n'a pas besoin de vi et de rechercher / remplacer des commandes. Je veux même copier les informations de propriété aussi (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

Vous pouvez personnaliser les commandes à l'intérieur stat -c '...'en ce que vous voulez. Pour toutes les options disponibles, voir man stat.

Tomofumi
la source
Votre script gère-t-il les noms avec des retours à la ligne intégrés?
Deer Hunter
@ deer-hunter Cela devrait fonctionner tel quel, sinon, vous pouvez ajouter une citation ".." autour de la partie du nom de fichier.
Tomofumi