Existuje příkaz nebo příznak klonování vlastnictví uživatele a skupiny a oprávnění k souboru z jiného souboru? Chcete-li, aby perms a vlastnictví přesně ty z jiného souboru?
Na GNU/Linuxu mají chown
a chmod
možnost --reference
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
Na jakémkoli unixu s nástroji GNU), jako je (neintegrovaný) Linux nebo Cygwin, můžete použít chmod --reference
a chown --reference
.
Pokud má váš systém ACL , zkuste příkazy ACL getfacl
a setfacl
. Tyto příkazy se mezi jednotlivými systémy trochu liší, ale na mnoha můžete použít getfacl other_file | setfacl -bnM - file_to_change
pro zkopírování oprávnění. Toto nekopíruje vlastnictví; můžete to udělat s pečlivou analýzou ls -l other_file
za předpokladu, že nemáte jména uživatelů ani skupin obsahujících mezeru.
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
Udělal bash příkaz na základě odpovědi Matteo :)
Kód:
chmod $( stat -f '%p' "$1" ) "${@:2}"
Použití:
cp-permissions <from> <to>...
Pokud nepoužíváte systém s chmod/chown GNU (které podporují --reference
option) můžete zkusit analyzovat výstup ls -l
Zde je malý skript pro chmod
(pokud vidíte, který podporuje rozšířené regexy, mohly by být psány mnohem čitelnějším způsobem ...)
#!/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}
AKTUALIZACE :
To je ještě snazší pomocí stat
:
chmod $( stat -f '%p' ${reference} ) ${files}
Funguje to pro mě:
cp -p --attributes-only <from> <to>
Chtěl jsem přidat úpravu do skriptu Matteo . Smyčka for for by měla být použita k ověření, že soubory existují před skutečným spuštěním příkazu chmod na nich. Díky tomu bude chyba skriptu ladnější.
Myslím, že je to nejlepší volba, protože ji lze použít pro všechny * nix OS, jako jsou Solaris, Linux atd.
#!/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}
Zjistil jsem, že na jednom z mých strojů Solaris 10 nebyl nalezen stat
. To by ale mohl být problém s mou konfigurací.