Clona a propriedade e as permissões de outro arquivo?

112

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?

    
por user394 13.09.2011 / 20:24

5 respostas

158

No GNU / Linux chown e chmod tem uma opção --reference

chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
    
por 13.09.2011 / 20:41
10

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
    
por 14.09.2011 / 01:08
6

Fiz um comando bash baseado na resposta de Matteo :)

Código:

chmod $( stat -f '%p' "$1" ) "${@:2}"

Uso:

cp-permissions <from> <to>...

    
por 26.05.2015 / 00:58
5

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}
    
por 13.09.2011 / 21:01
0

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.

    
por 18.10.2016 / 19:16