Antworten:
Auf GNU / Linux chownund chmodhaben eine --referenceOption
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
--referenceParameter von chmodund chownzuvor geachtet :).
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
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")" 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. "
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}
ls -lAusgabe zu analysieren, können Sie auch die statAusgabe analysieren .
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.
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.
Das funktioniert bei mir:
cp -p --attributes-only <from> <to>