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?
Sur GNU/Linux chown
et chmod
ont un --reference
option
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
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>...
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}
Cela fonctionne pour moi:
cp -p --attributes-only <from> <to>
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.