Besitz und Berechtigungen einer anderen Datei klonen?

125

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 zu denen einer anderen Datei zu machen?

user394
quelle

Antworten:

175

Auf GNU / Linux chownund chmodhaben eine --referenceOption

chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
Enzotib
quelle
1
Könnten Sie auf diese Antwort verweisen (und sie wahrscheinlich zitieren) als Antwort auf meine Frage: unix.stackexchange.com/questions/44253/… ? Ich denke, ich werde eine großartige Ergänzung sein, und ich würde mich freuen, dort für sie zu stimmen.
Grzegorz Wierzowiecki
@GrzegorzWierzowiecki: wahrscheinlich sollte diese Frage geschlossen werden, ist aber ein bisschen anders als diese und hat bereits Antworten, also mache ich besser nichts.
Enzotib
Wie Sie wünschen und vorschlagen. Danke für die Hilfe, ich habe noch nie auf --referenceParameter von chmodund chownzuvor geachtet :).
Grzegorz Wierzowiecki
12

Auf jedem Unix mit GNU-Dienstprogrammen wie (nicht eingebettetem) Linux oder Cygwin können Sie chmod --referenceund verwendenchown --reference .

Wenn Ihr System über ACLs verfügt , versuchen Sie es mit den ACL-Befehlen getfaclund setfacl. Diese Befehle unterscheiden sich ein wenig von System zu System, aber auf vielen können Sie getfacl other_file | setfacl -bnM - file_to_changedie Berechtigungen kopieren. Dies kopiert nicht das Eigentum; Sie können dies mit einer sorgfältigen Analyse von ls -l other_filetun, 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
Gilles
quelle
1
Sie sollten ACL installiert und das Dateisystem mit aktivierter ACL gemountet haben.
Enzotib
2
@enzotib Zumindest unter Linux funktionieren ACL-Tools zum Kopieren von Berechtigungen (aber nicht zum Besitz), auch wenn das Quell- und Zieldateisystem keine ACLs unterstützt.
Gilles
7

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

Code:

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

Verwendungszweck:

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

mjlescano
quelle
5
Egad! Wo hast du gelernt zu sagen ${*:2}? Mach das nie wieder! Dies schlägt fehl, wenn einer der Dateinamen Leerzeichen (oder Tabulatoren) enthält. Verwenden Sie "${@:2}". Verwenden Sie auch "$1"anstelle von nur $1.
G-Man
chmod "$(stat -c '%a' "$fromfile")" tofilein GNU Coreutils, aber Sie können es auch --referencein diesem Fall verwenden, da das statCLI-Dienstprogramm nicht POSIX ist. Es sagt sogar pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.htmlthat ls -l es nicht gekürzt: "Die Ausgabe von ls (mit der Option -l und verwandten Optionen) enthält Informationen, die logischerweise von Dienstprogrammen wie chmod und touch verwendet werden können, um Dateien in einem bekannten Zustand wiederherzustellen leicht in ein Format übersetzt, das verwendet werden kann. "
Ciro Santilli
5

Wenn Sie kein System mit chmod / chown von GNU verwenden (das die --referenceOption unterstützt), können Sie versuchen, die Ausgabe von zu analysierenls -l

Hier ein kleines Skript für chmod(wenn Sie einen See haben, der erweiterte Regexes unterstützt, könnten sie viel lesbarer 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 noch einfacher mit stat:

chmod $( stat -f '%p' ${reference} ) ${files}
Matteo
quelle
2
Anstatt die ls -lAusgabe zu analysieren, können Sie auch die statAusgabe analysieren .
jfg956
@jfgagne: danke macht sinn ich weiß nicht warum ich überhaupt nicht darüber nachgedacht habe. Ich habe die Antwort aktualisiert
Matteo
1
Sie verwenden hier die * BSD- statSyntax. Ihr chmod $(stat ...)Befehl funktioniert nicht, da %pallein zu viele Informationen für * BSDs ausgegeben werden. chmodVerwenden Sie diesen Befehl , um %Lpnur die U / G / O-Bits auszugeben. Etwas aufwendigeres wäre für Sticky / Setuid / Setgid-Bits erforderlich.
mr.spuratic
0

Ich wollte Matteos Skript anpassen. Eine for-Schleife sollte verwendet werden, um zu überprüfen, ob die Dateien vorhanden sind, bevor der Befehl chmod für sie ausgeführt wird. Dadurch wird der Skriptfehler eleganter.

Ich denke, dies ist die beste Option, da sie 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 fand, dass auf einem meiner Solaris 10-Computer statnicht gefunden wurde. Das könnte jedoch ein Problem mit meiner Konfiguration sein.

David
quelle
0

Das funktioniert bei mir:

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

user172554
quelle