14 votes

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

(De : https://stackoverflow.com/questions/15245144/copy-file-permissions-but-not-files, fermée car hors-sujet)

J'ai deux copies de la même arborescence de répertoires. Elles contiennent presque les mêmes fichiers (une version peut avoir quelques fichiers en plus ou en moins). Cependant, la plupart des fichiers sont communs aux deux répertoires (ont les mêmes chemins relatifs et tout).

Supposons qu'ils soient dans les répertoires:

version1/
version2/

Le problème est que les autorisations dans version1/ ont été altérées, et je voudrais copier les autorisations de version2/ sans remplacer les fichiers de version1/ qui sont plus récents.

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

15voto

Tom Aac Points 1037

GNU cp connaît le drapeau --attributes-only depuis coreutils 8.6

--attributes-only ne copie pas les données du fichier, seulement les attributs

14voto

shearn89 Points 3102

Ma version de cp n'a pas le drapeau --attributes-only, donc j'ai travaillé sur ceci. Testé brièvement sur des dossiers simples, vos résultats peuvent varier.

$> ls
version1/
version2/
$> ls -l version1/1/a
-rw-rw-r-- 1 alex alex 0 fév  5 12:49 version1/1/a
$> ls -l version2/1/a
-rwxrwxrwx 1 alex alex 0 fév  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 fév  5 12:49 version1/1/a

5voto

data Points 131

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

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

chown --reference=RFILE votrefichier
chmod --reference=RFILE votrefichier

Il utilise les paramètres de RFILE (permissions, propriétaire, groupe, etc..) et les copie dans votrefichier.

Le manuel explique en détail.

0voto

Maik Points 256

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

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

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

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

0voto

Tomofumi Points 129

Inspiré par la réponse de Mariano Paniga, je pense en avoir une meilleure, qui n'a pas besoin de commandes vi et de recherche/remplacement. 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 de stat -c '...' en tout ce que vous voulez. Pour toutes les options disponibles, voir man stat.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X