Risposte:
Su GNU / Linux chown
e chmod
hanno --reference
un'opzione
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
--reference
parametri di chmod
e chown
prima :).
Su qualsiasi Unix con utility GNU, come Linux (non incorporato) o Cygwin, puoi usare chmod --reference
echown --reference
.
Se il tuo sistema ha ACL , prova i comandi ACL getfacl
e setfacl
. Questi comandi differiscono leggermente da sistema a sistema, ma su molti è possibile utilizzare getfacl other_file | setfacl -bnM - file_to_change
per copiare le autorizzazioni. Questo non copia la proprietà; puoi farlo analizzando attentamente ls -l other_file
, supponendo che non hai nomi utente o di gruppo contenenti spazi bianchi.
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
Ha fatto un comando bash basato sulla risposta di Matteo :)
Codice:
chmod $( stat -f '%p' "$1" ) "${@:2}"
Uso:
cp-permissions <from> <to>...
${*:2}
? Non farlo mai più! Ciò fallirà se uno dei nomi di file contiene spazio (o schede). Usa "${@:2}"
. Inoltre, utilizzare "$1"
invece di solo $1
.
chmod "$(stat -c '%a' "$fromfile")" tofile
in GNU Coreutils, ma potresti anche usarlo --reference
in quel caso poiché l' stat
utilità CLI non è POSIX, dice anche pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html ls -l
che non lo taglierà: "L'output di ls (con -l e le opzioni correlate) contiene informazioni che logicamente potrebbero essere utilizzate da utility come chmod e touch per ripristinare i file in uno stato noto. Tuttavia, queste informazioni sono presentate in un formato che non può essere utilizzato direttamente da tali utility o essere facilmente tradotto in un formato che può essere utilizzato. "
Se non stai usando un sistema con chmod / chown di GNU (che supporta l' --reference
opzione) potresti provare ad analizzare l'output dils -l
Ecco un piccolo script per chmod
(se hai un vedere che supporta regex estese potrebbero essere scritte in un modo molto più leggibile ...)
#!/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}
AGGIORNAMENTO :
Questo è ancora più semplice usando stat
:
chmod $( stat -f '%p' ${reference} ) ${files}
ls -l
output, potresti analizzare l' stat
output.
stat
sintassi * BSD qui. Il tuo chmod $(stat ...)
comando non funzionerà perché %p
da solo emette troppe informazioni per * BSD chmod
, usate solo %Lp
per emettere i bit u / g / o. Qualcosa di leggermente più elaborato sarebbe richiesto per i bit sticky / setuid / setgid.
Volevo aggiungere un adattamento alla sceneggiatura di Matteo . Un ciclo for dovrebbe essere usato per confermare l'esistenza dei file prima di eseguire effettivamente il comando chmod su di essi. Ciò consentirà l'errore di script più elegantemente.
Penso che questa sia l'opzione migliore perché può essere utilizzata per tutti i sistemi operativi * nix, come Solaris, Linux, ecc.
#!/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}
Ho scoperto che su una delle mie macchine Solaris 10 stat
non è stato trovato. Potrebbe essere un problema con la mia configurazione.
Questo funziona per me:
cp -p --attributes-only <from> <to>