Existe-t-il une commande ou un indicateur permettant de cloner la propriété de l'utilisateur / groupe et les autorisations sur un fichier à partir d'un autre fichier? Rendre les permanentes et la propriété exactement celles d'un autre fichier?
Existe-t-il une commande ou un indicateur permettant de cloner la propriété de l'utilisateur / groupe et les autorisations sur un fichier à partir d'un autre fichier? Rendre les permanentes et la propriété exactement celles d'un autre fichier?
Réponses:
Sur GNU / Linux chown
et chmod
avoir une --reference
option
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
--reference
paramètre d' chmod
et chown
avant :).
Sur tout UNIX avec des utilitaires GNU, tels que Linux (non intégré) ou Cygwin, vous pouvez utiliser chmod --reference
etchown --reference
.
Si votre système possède des ACL , essayez les commandes ACL getfacl
et setfacl
. Ces commandes diffèrent légèrement d’un système à l’autre, mais sur beaucoup d’entre elles, 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 avec une analyse minutieuse de ls -l other_file
, en supposant que vous n'avez pas de nom d'utilisateur ou de groupe 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
Est-ce qu'une commande bash basée sur la réponse de Matteo :)
Code:
chmod $( stat -f '%p' "$1" ) "${@:2}"
Usage:
cp-permissions <from> <to>...
${*:2}
? Ne refais plus jamais ça! Cela échouera si l'un des noms de fichiers contient un espace (ou des onglets). Utilisez "${@:2}"
. Aussi, utilisez "$1"
plutôt que juste $1
.
chmod "$(stat -c '%a' "$fromfile")" tofile
dans GNU Coreutils, mais vous pourriez aussi bien l'utiliser --reference
dans ce cas puisque l' stat
utilitaire de la CLI n'est pas POSIX, il est même indiqué que pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.htmlthat ls -l
ne le coupera pas: "La sortie de ls (avec l'option -l et les options associées) contient des informations pouvant être utilisées de manière logique par des utilitaires tels que chmod et touch pour restaurer les fichiers dans un état connu. facilement traduit dans un format utilisable. "
Si vous n’utilisez pas de système avec chmod / chown de GNU (qui supporte l’ --reference
option), vous pouvez essayer d’analyser la sortie dels -l
Voici un petit script pour chmod
(si vous voyez un fichier qui supporte les expressions rationnelles étendues, elles pourraient être écrites 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}
ls -l
sortie, vous pouvez analyser la stat
sortie.
stat
syntaxe * BSD ici. Votre chmod $(stat ...)
commande ne fonctionnera pas car à elle %p
seule génère trop d'informations pour * BSD chmod
, utilisez-les %Lp
pour générer uniquement les bits u / g / o. Quelque chose de légèrement plus élaboré serait nécessaire pour les bits sticky / setuid / setgid.
Je voulais ajouter un ajustement au script de Matteo . Une boucle for doit être utilisée pour valider l'existence des fichiers avant d'exécuter la commande chmod sur ceux-ci. Cela laissera le script sortir plus gracieusement.
Je pense que c'est la meilleure option car elle peut être utilisée pour tous les systèmes d'exploitation * nix, tels que 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 trouvé que sur l'une de mes machines Solaris 10, stat
n'a pas été trouvé. Cela pourrait cependant être un problème avec ma configuration.
Cela fonctionne pour moi:
cp -p --attributes-only <from> <to>