Antworten:
Auf GNU / Linux chown
und chmod
haben eine --reference
Option
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
--reference
Parameter von chmod
und chown
zuvor geachtet :).
Auf jedem Unix mit GNU-Dienstprogrammen wie (nicht eingebettetem) Linux oder Cygwin können Sie chmod --reference
und verwendenchown --reference
.
Wenn Ihr System über ACLs verfügt , versuchen Sie es mit den ACL-Befehlen getfacl
und setfacl
. Diese Befehle unterscheiden sich ein wenig von System zu System, aber auf vielen können Sie getfacl other_file | setfacl -bnM - file_to_change
die Berechtigungen 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}"
Verwendungszweck:
cp-permissions <from> <to>...
${*: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
.
chmod "$(stat -c '%a' "$fromfile")" tofile
in GNU Coreutils, aber Sie können es auch --reference
in diesem Fall verwenden, da das stat
CLI-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. "
Wenn Sie kein System mit chmod / chown von GNU verwenden (das die --reference
Option 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}
ls -l
Ausgabe zu analysieren, können Sie auch die stat
Ausgabe analysieren .
stat
Syntax. Ihr chmod $(stat ...)
Befehl funktioniert nicht, da %p
allein zu viele Informationen für * BSDs ausgegeben werden. chmod
Verwenden Sie diesen Befehl , um %Lp
nur die U / G / O-Bits auszugeben. Etwas aufwendigeres wäre für Sticky / Setuid / Setgid-Bits erforderlich.
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 stat
nicht gefunden wurde. Das könnte jedoch ein Problem mit meiner Konfiguration sein.
Das funktioniert bei mir:
cp -p --attributes-only <from> <to>