Sobrescreve o arquivo preservando as permissões de destino sem a invocação do shell

1

Eu tenho essa situação

$ ls -la
-rw-r--r-- 1 user user 123 Mar  5 19:32 file-a
-rwx---rwx 1 user user 987 Mar  5 19:32 file-b

Gostaria de substituir file-b por file-a , mas gostaria de preservar todas as permissões e propriedade de file-b .

Isso não funciona, porque usa permissões de file-a

cp file-a file-b # << edit: this works as expected! My fault!
mv file-a file-b

Isso funciona, mas pode ser chamado somente do shell. Imagine a situação que eu posso chamar apenas execve ou função similar.

cat file-a > file-b

Eu sei que posso executar algo como

sh -c "cat file-a > file-b"

mas isso apresenta dificuldades em escapar nomes de arquivos, então não quero usar isso.

Existe algum comando comum que pode fazer isso ou devo escrever meu próprio programa auxiliar c para esta tarefa?

    
por j123b567 05.03.2018 / 19:50

2 respostas

1

Um comando simples para copiar um arquivo sem copiar o modo é

dd if=file-a of=file-b

mas você recebe a mensagem de status detalhado de dd escrita para stderr. Você pode suprimir isso executando o comando em um shell e adicionando 2> /dev/null , mas então você está de volta ao quadrado 1. Se você tem o GNU dd , você pode fazer

dd if=file-a of=file-b status=none
    
por 05.03.2018 / 20:24
2

rsync --inplace file-a file-b deve fazer o que quiser.

link

--inplace This option changes how rsync transfers a file when the file's data needs to be updated: instead of the default method of creating a new copy of the file and moving it into place when it is complete, rsync instead writes the updated data directly to the destination file.
    
por 05.03.2018 / 20:06