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?


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


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

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.


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ù.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.