No GNU / Linux chown
e chmod
tem uma opção --reference
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
Existe um comando ou sinalizador para clonar a propriedade e permissões do usuário / grupo em um arquivo de outro arquivo? Para tornar os perms e posse exatamente aqueles de outro arquivo?
Em qualquer unix com utilitários GNU, como Linux (não integrado) ou Cygwin, você pode usar chmod --reference
e chown --reference
.
Se o seu sistema tiver ACLs , experimente os comandos ACL getfacl
e setfacl
. Esses comandos diferem um pouco de sistema para sistema, mas em muitos você pode usar getfacl other_file | setfacl -bnM - file_to_change
para copiar as permissões. Isso não copia a propriedade; você pode fazer isso com uma análise cuidadosa de ls -l other_file
, supondo que você não tenha nomes de usuários ou grupos contendo espaço em branco.
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
Fiz um comando bash baseado na resposta de Matteo :)
Código:
chmod $( stat -f '%p' "$1" ) "${@:2}"
Uso:
cp-permissions <from> <to>...
Se você não estiver usando um sistema com chmod / chown do GNU (que suporta a opção --reference
) você pode tentar analisar a saída de ls -l
Aqui está um pequeno script para chmod
(se você tem um ver que suporta regexes estendidas, eles podem ser escritos de uma forma muito mais legível ...)
#!/bin/sh
reference=$1
shift
files=$*
# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*//" | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*//" | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*//" | sed -e "s/[-]//g" )
chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}
UPDATE :
Isso é ainda mais fácil usando stat
:
chmod $( stat -f '%p' ${reference} ) ${files}
Eu queria adicionar um ajuste ao script Matteo . Um loop for deve ser usado para validar que os arquivos existem antes de executar o comando chmod neles. Isso permitirá que o erro do script seja mais fácil.
Acho que esta é a melhor opção porque pode ser usada para todos os sistemas operacionais * nix, como Solaris, Linux, etc.
#!/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/.\(...\).*//" | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*//" | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*//" | sed -e "s/[-]//g" )
chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}
Descobri que em uma das minhas máquinas do Solaris 10, stat
não foi encontrado. Isso pode ser um problema com minha configuração.
Tags permissions files chown shell