web-dev-qa-db-fra.com

Cloner la propriété et les autorisations d'un autre fichier?

Existe-t-il une commande ou un indicateur pour cloner la propriété et les autorisations de l'utilisateur/groupe sur un fichier à partir d'un autre fichier? Pour rendre les perms et la propriété exactement ceux d'un autre fichier?

132
user394

Sur GNU/Linux chown et chmod ont un --reference option

chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
185
enzotib

Sur tout Unix avec les utilitaires GNU, tels que Linux (ou non embarqué) ou Cygwin, vous pouvez utiliser chmod --reference et chown --reference .

Si votre système a ACLs , essayez les commandes ACL getfacl et setfacl. Ces commandes diffèrent légèrement d'un système à l'autre, mais sur de nombreuses autres, vous pouvez utiliser getfacl other_file | setfacl -bnM - file_to_change pour copier les autorisations. Cela ne copie pas la propriété; vous pouvez le faire en analysant soigneusement ls -l other_file, en supposant que vous n'avez pas de noms d'utilisateurs ou de groupes contenant des espaces.

LC_ALL=C ls -l other_file | {
  read -r permissions links user group stuff;
  chown -- "$user:$group" file_to_change
}
getfacl other_file | setfacl -bnM - file_to_change

A fait une commande bash basée sur la réponse de Matteo :)

Code:

chmod $( stat -f '%p' "$1" ) "${@:2}"

Utilisation:

cp-permissions <from> <to>...

8
mjlescano

Si vous n'utilisez pas un système avec chmod/chown de GNU (qui supporte le --reference option), vous pouvez essayer d'analyser la sortie de ls -l

Voici un petit script pour chmod (si vous avez un voir qui supporte les expressions rationnelles étendues, ils pourraient être écrits de manière beaucoup plus lisible ...)

#!/bin/sh

reference=$1
shift
files=$*

# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*/\1/"       | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*/\1/"    | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*/\1/" | sed -e "s/[-]//g" )

chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}

MISE À JOUR :

C'est encore plus simple avec stat:

chmod $( stat -f '%p' ${reference} ) ${files}
5
Matteo

Cela fonctionne pour moi:

cp -p --attributes-only <from> <to>

0
user172554

Je voulais ajouter un ajustement au script de Matteo . Une boucle for doit être utilisée pour valider que les fichiers existent avant d'exécuter réellement la commande chmod sur eux. Cela laissera l'erreur de script sortir plus gracieusement.

Je pense que c'est la meilleure option car elle peut être utilisée pour tous les OS * nix, comme Solaris, Linux, etc.

#!/bin/sh

reference=$1
shift
files=$*

for file in $reference $files; do
  [ -f $file ] || { echo "$file does not exist"; exit 1; }
done

# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*/\1/" | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*/\1/" | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*/\1/" | sed -e "s/[-]//g" )

chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}

J'ai constaté que sur une de mes machines Solaris 10, stat était introuvable. Cela pourrait être un problème avec ma configuration.

0
David