it-swarm-eu.dev

Klonovat vlastnictví a oprávnění z jiného souboru?

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?

132
user394

Na GNU/Linuxu mají chown a chmod možnost --reference

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

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>...

8
mjlescano

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}
5
Matteo

Funguje to pro mě:

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

0
user172554

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í.

0
David