it-swarm.com.de

Besitz und Berechtigungen aus einer anderen Datei klonen?

Gibt es einen Befehl oder ein Flag zum Klonen des Benutzer-/Gruppenbesitzes und der Berechtigungen für eine Datei aus einer anderen Datei? Um die Dauerwellen und das Eigentum genau denen einer anderen Datei zu machen?

132
user394

Unter GNU/Linux haben chown und chmod ein --reference Möglichkeit

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

Unter jedem Unix mit GNU-Dienstprogrammen wie (nicht eingebettetem) Linux oder Cygwin können Sie chmod --reference Und chown --reference verwenden .

Wenn Ihr System ACLs hat, versuchen Sie die ACL-Befehle getfacl und setfacl. Diese Befehle unterscheiden sich ein wenig von System zu System, aber bei vielen können Sie getfacl other_file | setfacl -bnM - file_to_change Verwenden, um die Berechtigungen zu kopieren. Dies kopiert nicht das Eigentum; Sie können dies mit einer sorgfältigen Analyse von ls -l other_file tun, vorausgesetzt, Sie haben keine Benutzer- oder Gruppennamen, die Leerzeichen enthalten.

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

Habe einen bash Befehl basierend auf der Antwort von Matteo :)

Code:

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

Verwendung:

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

8
mjlescano

Wenn Sie kein System mit chmod/chown von GNU verwenden (das die Option --reference Unterstützt), können Sie versuchen, die Ausgabe von ls -l Zu analysieren.

Hier ein kleines Skript für chmod (wenn Sie sehen, welche erweiterten regulären Ausdrücke unterstützt werden, können sie viel besser lesbar geschrieben werden ...)

#!/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}

UPDATE :

Dies ist mit stat noch einfacher:

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

Das funktioniert bei mir:

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

0
user172554

Ich wollte das Skript von Matteo anpassen. Eine for-Schleife sollte verwendet werden, um zu überprüfen, ob die Dateien vorhanden sind, bevor der Befehl chmod tatsächlich ausgeführt wird. Dadurch wird der Skriptfehler eleganter ausgegeben.

Ich denke, dies ist die beste Option, da es für alle * nix-Betriebssysteme wie Solaris, Linux usw. verwendet werden kann.

#!/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}

Ich habe festgestellt, dass auf einem meiner Solaris 10-Computer stat nicht gefunden wurde. Dies könnte jedoch ein Problem mit meiner Konfiguration sein.

0
David